当前位置: 首页 > news >正文

结构体和联合体嵌套访问

在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这个结构体里面根本没有这个成员变量!!!恨不得抽自己几个大嘴巴子。

http://www.lryc.cn/news/211968.html

相关文章:

  • Linux ———— 管理磁盘
  • 文字的编码
  • 21.9 Python 使用Selenium库
  • C++初阶2
  • 网络安全(黑客)—小白自学
  • 在win10下,使用torchviz对深度学习网络模型进行可视化
  • 【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer
  • 交叉编译工具链(以STM32MP1为例)
  • 使用 Pyro 和 PyTorch 的贝叶斯神经网络
  • How to install the console system of i-search rpa on Centos 7
  • sql--索引使用 ---覆盖索引
  • 系统平台同一网络下不同设备及进程的话题通讯--DDS数据分发服务中间件
  • 轻量级 IDE 文本编辑器 Geany 发布 2.0
  • 好用工具分享 | tmux 终端会话分离工具
  • 计算机网络重点概念整理-第三章 数据链路层【期末复习|考研复习】
  • 迅速的更改conda 环境的名称!
  • 基本微信小程序的外卖点餐订餐平台
  • 十大排序算法(C语言)
  • iTransformer: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING
  • QT C++ AES字符串加密实现
  • 关于mysql json字段创建索引
  • “探索Linux世界:从CentOS安装到常见命令使用“
  • SVN出现Cleanup failed to process the following paths...
  • gitee上传项目
  • 实现文件上传和下载
  • 大数据-Storm流式框架(七)---Storm事务
  • Kafka - 3.x Kafka消费者不完全指北
  • Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转
  • 使用c++编程语言,用递归的方法求第n个斐波那契数,代码如下
  • git config pull.rebase false