gpt4 book ai didi

C - 不寻常的数组初始化

转载 作者:行者123 更新时间:2023-12-01 13:38:29 25 4
gpt4 key购买 nike

我正在处理一些具有这种异常数组初始化的遗留 C 代码:

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

头文件是逗号分隔的数字和注释的列表。我以前从未见过这种构造,但它似乎确实可以正常工作。放在页眉里面不是更好吗:

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

然后

 #include "modbusDefs40000.h"

在 .c 文件中?

我怀疑它存在的原因是头文件是由 python 脚本创建的。如果您对这个习语发表评论,如果您看过类似的评论,我将不胜感激。

谢谢,

jh

最佳答案

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

由于 C 头文件应具有特定结构,因此将文件命名为 modbusDefs40000.h 具有误导性。使用不同的扩展名,例如modbusDefs40000.data 或具有相同效果的内容,将使读者更清楚该文件的用途。

如果您正在寻找一种方法来重构它以使其更清晰,请考虑制作一个带有数组前向声明的 header ,即

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

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

关于C - 不寻常的数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42259349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com