C - 异常数组初始化

时间:2017-02-15 20:26:01

标签: c arrays initialization

我正在研究一些具有这种不寻常的数组初始化的遗留C代码:

uint32_t defsMB40000[REG40000_SIZE] = 
{
 #include "modbusDefs40000.h"
}; 

头文件是逗号分隔的数字和注释的列表。我之前从未见过这个构造,但它似乎确实正常工作。在标题内部是不是更好:

uint32_t defsMB40000[REG40000_SIZE] = 
{
   0,
   0xFF,
   ...
}; 

然后

 #include "modbusDefs40000.h"
<。>在.c文件中?

我怀疑它甚至存在的原因是头文件是由python脚本创建的。我很感激你对这个成语的评论,如果你看过它的喜欢的话。

谢谢,

JH

1 个答案:

答案 0 :(得分:3)

这不是一个成语,它只是一个使用C预处理器规则完成工作的技巧。从本质上讲,作者依赖于这样一个事实:C预处理器的工作方式就好像文件的内容在字面上嵌入了包含点。结果很混乱,但它完成了初始化数组的任务。

由于预期C头具有特定结构,因此命名文件modbusDefs40000.h会产生误导。使用不同的扩展名,例如modbusDefs40000.data或具有相同效果的内容会让读者更清楚地了解文件的用途。

如果您正在寻找一种重构方法以便更清晰,请考虑使用数组的前向声明制作标题,即

// modbusDefs40000.h
extern uint32_t defsMB40000[REG40000_SIZE];

并更改Python脚本以在初始化程序的数据部分周围生成完整的声明(即两个固定行 - 顶部为uint32_t defsMB40000[REG40000_SIZE] = {,底部为};。调用生成的文件{{1} },并将其与项目中的其他C文件一起使用。