c - #include .c 源文件是否可以用于嵌入式 C 代码的可维护性?
问题描述
我不是 C 程序员专家,我知道包含.c
来自另一个人的源文件被认为是不好的做法,但我有一种情况,我认为它可以帮助可维护性。
我有一个包含很多元素的大结构,我用它#define
来保存索引。
#define TOTO_IND 0
#define TITI_IND 1
…
#define TATA_IND 50
static const MyElements elems [] = {
{"TOTO", 18, "French"},
{"TITI", 27, "English"},
...,
{"TATA", 45, "Spanish"}
}
由于我需要从索引访问结构,我需要保持#define
和结构声明同步。这意味着我必须在正确的位置插入新元素并相应地更新#define
。
它容易出错,我不太喜欢它(但出于性能考虑,我没有找到更好的解决方案)。
无论如何,这个文件还包含很多处理这个结构的函数。我还想保持代码分离并避免使用全局变量。
为了让事情“更容易”,我正在考虑将这个“容易出错的定义”移动到一个.c
只包含这个结构的源文件中。该文件将是“小心谨慎的危险文件”,并将其包含在我实际的“正常功能”文件中。
你怎么看待这件事?包含.c
源文件是否有效?还有另一种更好的方法来处理我的结构吗?
解决方案
您可以使用指定的初始化程序来初始化 的元素,elems[]
而不必知道每个索引标识符(或宏)的显式值。
const MyElements elems[] = {
[TOTO_IND] = {"TOTO", 18, "French"},
[TITI_IND] = {"TITI", 27, "English"},
[TATA_IND] = {"TATA", 45, "Spanish"},
};
数组元素将以相同的方式初始化,即使您更改它们在源代码中出现的顺序:
const MyElements elems[] = {
[TITI_IND] = {"TITI", 27, "English"},
[TATA_IND] = {"TATA", 45, "Spanish"},
[TOTO_IND] = {"TOTO", 18, "French"},
};
如果数组长度是从上面的初始化程序自动设置的(即使用[]
而不是[NUM_ELEMS]
),那么长度将比最大元素索引大一。
这允许您将elems
数组的索引值和外部声明保存在 .h 文件中,并elems
在单独的 .c 文件中定义数组内容。
推荐阅读
- mysql - MySQL 存储过程更新多个数据库
- java - 如何使用来自 Spring Boot 项目的用户定义代码、消息和数据抛出 jsonrpc 错误对象
- javascript - 使用外键(id)以角度获取值(名称)
- django - Heroku 上带有容器注册表的发布阶段运行容器
- mysql - Lambda + Sequelize 随机获取 SequelizeConnectionError ETIMEDOUT
- javascript - Javascript/Jquery - 获取可见图像的链接
- android - RxJava2 Flowable:将对象发送到服务器并检测结束
- microsoft-graph-api - 使用 Microsoft Graph 从 Office 365/Exchange 读取联系人列表
- python - 使用 StandardScaler 使用特定功能缩放具有不同形状的数组
- python - plotly.express 中的自定义 histnorm density_heatmap