目前,我正在使用嵌入式设备。
我正在创建自己的"寄存器表示",以学习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解决方案和预处理器解决方案。
1条答案
按热度按时间osh3o9ms1#
您可以创建未命名的位域:
根据C standard关于“结构和联合说明符”的第6.7.2.1p12节,允许此类构造:
没有声明符而只有冒号和宽度的位字段声明指示未命名的位字段。126)作为特殊情况,宽度为0的位字段结构成员指示没有进一步的位字段将被打包到先前位字段(如果有的话)被放置的单元中。
126)未命名的位域结构成员对于填充以符合外部强加的布局是有用的。
注意,零大小的位域也适用于这种情况,但这只是因为没有其他位域跟随它。