首页 > 解决方案 > #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源文件是否有效?还有另一种更好的方法来处理我的结构吗?

标签: cperformanceembeddedstm32maintainability

解决方案


您可以使用指定的初始化程序来初始化 的元素,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 文件中定义数组内容。


推荐阅读