我正在研究一些具有这种不寻常的数组初始化的遗留C代码:
uint32_t defsMB40000[REG40000_SIZE] =
{
#include "modbusDefs40000.h"
};
头文件是逗号分隔的数字和注释的列表。我之前从未见过这个构造,但它似乎确实正常工作。在标题内部是不是更好:
uint32_t defsMB40000[REG40000_SIZE] =
{
0,
0xFF,
...
};
然后
#include "modbusDefs40000.h"
<。>在.c文件中?
我怀疑它甚至存在的原因是头文件是由python脚本创建的。我很感激你对这个成语的评论,如果你看过它的喜欢的话。
谢谢,
JH
答案 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文件一起使用。