结构体和联合体嵌套访问

在JSON项目中,使用了联合体和结构体之间的嵌套,但是在访问内部的联合体和结构体的时候出现了问题,这篇文章作为记录,也希望能帮助遇到相同问题的好伙伴。

复制代码
struct lept_value
{
    union 
    {
        struct str
        {
            char *s;
            size_t len;
        };

        double n;
    };

    lept_type type;
};

上面是最原始的代码,上面的代码可以通过下面的代码访问double n和lept_type type,

复制代码
// v是一个lept_value的指针
v->n;
v->type;

但是无法访问str结构体内部的成员。如果给结构体加上名,那么连n也无法访问。例如:

复制代码
struct lept_value
{
    union m_union
    {
        struct str
        {
            char *s;
            size_t len;
        };

        double n;
    };

    lept_type type;
};

我用下面的代码访问发现只提示有type一个成员。

v->m_union.str; // 无法访问

v->m_union.n; //无法访问

v->type; // 可以访问

后来通过翻译将问题翻译成英文:

如何访问结构体内部的联合体中的变量->How do I access variables in a union inside a struct

之后放到StackOverflow上进行了查询,很快有了结果,原解释如下:c++ - Accessing a variable in a union which is inside a class - Stack Overflow

复制代码
typedef struct {
    union {
        struct { char* s; size_t len; }s;  /* string: null-terminated string, string length */
        double n;                          /* number */
    }u;
    lept_type type;
}lept_value;

参考了c语言的代码和StackOverflow上的回答,发现自己简直s b一个。

问题的原因在于:**我的代码中只是声明了结构体,但是实际上并没有生成实际的对象,根本就没有这个成员,因此当然无法访问。就像使用lept_value这个数据结构,需要一个实际的对象才会分配内存,光给出声明怎么会允许访问呢?**将代码修改成如下,加入了m_data和m_union,意味着默认有这两个实例,有了实例之后一切的访问都可以了(struct和union默认访问权限是public)。

复制代码
struct lept_value
{
    union 
    {
        struct str
        {
            char *s;
            size_t len;
        }m_data;

        double n;
    }m_union;

    lept_type type;
};

// 访问方式
v->m_union.m_data.s;
v->m_union.n;
v->m_union_m_data.len;

问题到这里就解决了,后来想到vscode写代码的时候,每次提示都只显示一个type,别的显示不出来,这不就是在告诉我,你TM这个结构体里面根本没有这个成员变量!!!恨不得抽自己几个大嘴巴子。

相关推荐
Tairitsu_H38 分钟前
[C++] C++11新增构造:列表初始化和std::initializer_list
开发语言·c++·c++11·构造
hansang_IR1 小时前
【题解】P4456 [CQOI2018] 交错序列(矩阵乘法)
c++·线性代数·算法
光电笑映2 小时前
Linux 线程同步与互斥:锁的本质、条件变量与信号量的底层原理
linux·运维·服务器·开发语言·c++
jearry2 小时前
WebView2 原生拖放的桥接之道:拆解 yyzTools 的 drop-zone.js
前端·c++
零基础的修炼2 小时前
CUDA知识汇总
开发语言·c++·编辑器
欧特克_Glodon2 小时前
OpenCV计算机视觉开发入门与实践<三十八>:图像添加数字水印
c++·人工智能·opencv·计算机视觉
蒸蒸yyyyzwd2 小时前
与Redis和MySQL有关的知识
c++·求职招聘·八股
欧特克_Glodon2 小时前
OpenCV计算机视觉开发入门与实践<四十>:自动识别物体数量
c++·人工智能·opencv·计算机视觉
wuminyu3 小时前
Kafka利用sendfile与Page Cache实现高性能传输剖析
java·linux·c语言·jvm·c++
hansang_IR3 小时前
【题解】P4456 [CQOI2018] 交错序列(数学递推)
c++·算法