结构中的Gcc隐藏成员

093gszye  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(137)

目前,我正在使用嵌入式设备。
我正在创建自己的"寄存器表示",以学习C语言中的过程。
我是通过放置在给定位置的结构体来实现的:

struct myIo {
   u32 flagA : 1;
   u32 fieldB : 7;
   u32 reserved : 24;
   u32 regB;
};

struct __attribute__((section("sec"))) myIo MyIo;

这一切都很好,但我想知道我怎么才能删除

reserved

字段,而不损害由硬件实施的填充/对齐。

    • 我的问题是**

我怎么能设计一个结构体与"隐藏"字段,这将不会显示当我访问的结构体。
本质上:

MyStruct.reserved = val;

val = MyStruct.reserved;

应抛出编译器错误并键入

MyIo.

不应在Eclipse CDT C/C ++中显示"自动完成"选项。
我使用的是Arm Cross GCC和Eclipse CDT C/C ++。
我擅长C标准兼容的解决方案,编译器pragma解决方案和预处理器解决方案。

osh3o9ms

osh3o9ms1#

您可以创建未命名的位域:

struct myIo {
   u32 flagA : 1;
   u32 fieldB : 7;
   u32 : 24;
   u32 regB;
};

根据C standard关于“结构和联合说明符”的第6.7.2.1p12节,允许此类构造:
没有声明符而只有冒号和宽度的位字段声明指示未命名的位字段。126)作为特殊情况,宽度为0的位字段结构成员指示没有进一步的位字段将被打包到先前位字段(如果有的话)被放置的单元中。
126)未命名的位域结构成员对于填充以符合外部强加的布局是有用的。
注意,零大小的位域也适用于这种情况,但这只是因为没有其他位域跟随它。

相关问题