C语言 如何将匿名数组作为结构类型定义中的字段?

dauxcl2d  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(99)

IDE:Code Composer IDE版本12。
编译器:ti-cgt-arm_20.2.6.LTS
芯片:Texas Instruments AM 6442(ARM Cortex R5 F内核)。
语言:C
我正在写一些结构类型定义,定义一些硬件寄存器在内存中的布局。在某些外围模块的内存Map中,内存中可能存在相对较大的间隙(如1024字节)。其中一些外设相当复杂(比如500多个唯一的寄存器名称和各种填充区域)。所有寄存器均为32位对齐,32位长。为了解决这些空白,我将uint32_t数组作为填充。
现在,填充数组有了名称。但是,由于没有需要访问填充区域中的内存的情况(这可能会触发内存故障),我希望填充是匿名的。
使用匿名填充的优点是不会弄乱IDE中的代码完成弹出菜单。在这些菜单中,我只想看到我的寄存器名称,而不是所有填充区域的名称。

//Example
   typdef struct __attribute__((packed)){
      uint32_t REG1;
      uint32_t REG2;
      uint32_t REG3;
      uint32_t REG4;
      uint32_t PAD_1[64];
      uint32_t REG5;
      uint32_t REG6;
      uint32_t PAD_2[32];
      uint32_t REG7;
    }

**有没有办法让填充数组匿名?匿名数组以复合文字的形式存在,但我不知道在类型定义中有什么语法可以做到。我想避免像在结构中放置1000个匿名uint32_t这样的解决方案。

nlejzf6q

nlejzf6q1#

必须命名结构成员。寄存器Map的约定是将事物命名为reserved0reserved1等。如果你因为奇怪的IDE原因不能接受它,那么我想你必须做几个结构。虽然重写源代码以适应程序员/IDE的特殊口味总是一个坏主意,而不是让程序员/IDE适应现实。
正如@chux在评论中提到的,通过附加__LINE__来创建自动的、自增的数字可能是一个好主意:

#define CONCAT(x,y) x ## y
#define reserved(x) CONCAT(reserved_, x)

typedef struct
{
  uint32_t x;
  uint32_t reserved(__LINE__);
  uint32_t reserved(__LINE__);
} struct_t;

这将归结为这样的东西:

uint32_t reserved_7;
uint32_t reserved_8;

你确实可以在代码完成列表的末尾添加一个“z”来移动所有的寄存器名,比如CONCAT(zreserved_, x)等等。
你也可以使用这些宏来声明数组:uint32_t reserved(__LINE__) [10];将产生如下结果:

uint32_t reserved_8 [10];

另外请注意,在寄存器Map结构中使用__attribute__((packed))是非常可疑的-这里不应该发生自动结构填充。防止这种情况的正确方法是使用static_assert

static_assert(sizeof(mystruct) == expected, "Incorrect struct padding detected in mystruct.")

相关问题