Gcc 结构中的隐藏成员

问题描述 投票:0回答:1

目前,我正在使用嵌入式设备。

我正在创建自己的“寄存器表示”以学习 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 解决方案和预处理器解决方案。

c gcc struct hidden
1个回答
3
投票

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

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

根据 C 标准 关于“结构和联合说明符”的第 6.7.2.1p12 节,允许此类构造:

没有声明符的位域声明,只有一个冒号和一个 宽度,表示一个未命名的位域。 126) 作为一个特殊的 情况下,宽度为 0 的位域结构成员表示没有 进一步的位域将被打包到前一个位域所在的单元中 位域(如果有的话)被放置。


126 ) 一个未命名的位域结构成员对于填充到 符合外部强加的布局。

请注意,零大小的位域在这种情况下也可以使用,但这只是因为后面没有其他位域。

© www.soinside.com 2019 - 2024. All rights reserved.