gpt4 book ai didi

c - 易于维护的标识符与文本表

转载 作者:行者123 更新时间:2023-11-30 15:46:23 25 4
gpt4 key购买 nike

在我们的项目中,我们有数百个用于错误代码的标识符,例如:

#define SYS_FAIL_EXCEP_PREFETCH_ABORT       0
#define SYS_FAIL_EXCEP_DATA_ABORT 1
#define SYS_FAIL_EXCEP_RESET 2
#define SYS_FAIL_EXCEP_UNDEFINED 3
#define SYS_FAIL_EXCEP_RESERVED 4
#define SYS_FAIL_EXCEP_IRQ_UNVECTORED 5

我们的要求之一是打印标识符的名称或文本。我们为此使用查找表:

typedef struct HAL_Map_Text_ID_struct
{
unsigned int id;
char const * const text;
} HAL_Map_Text_ID_t;

static const HAL_Map_Text_ID_t system_failure_text_id_map[] =
{
// ID Text
// The following text has the prefix SYS_FAIL_EXCEP_
{SYS_FAIL_EXCEP_PREFETCH_ABORT, "PREFETCH_ABORT"},
{SYS_FAIL_EXCEP_DATA_ABORT, "DATA_ABORT"},
{SYS_FAIL_EXCEP_RESET, "RESET"},
{SYS_FAIL_EXCEP_UNDEFINED, "UNDEFINED"},
{SYS_FAIL_EXCEP_RESERVED, "RESERVED"},
{SYS_FAIL_EXCEP_IRQ_UNVECTORED, "IRQ_UNVECTORED"},
};

我们的问题是,当有人添加标识符但忘记更新表时,表和错误代码列表可能会不同步。

是否有一种习惯用法或其他过程可以让我们添加标识符并且表格会自动更新?

我们更喜欢这样的解决方案:标识符位于头文件中,表位于源文件中。

此外,如果可能的话,解决方案应符合 MISRA 标准。

(我们使用 C89 和 IAR 嵌入式工作台,目标系统使用 ARM7 处理器。)

最佳答案

您可以使用宏系统来帮助创建单点标识符更新,该更新也将更新您的字符串。但是,此方案将标识符从宏转换为枚举常量。我正在输入此内容,因此未经测试:

#define SYS_FAIL_EXCEPTIONS \
SYS_FAIL_EXCEP(PREFETCH_ABORT) \
SYS_FAIL_EXCEP(DATA_ABORT) \
SYS_FAIL_EXCEP(RESET) \
SYS_FAIL_EXCEP(UNDEFINED) \
SYS_FAIL_EXCEP(RESERVED) \
SYS_FAIL_EXCEP(IRQ_UNVECTORED)

enum {
#define SYS_FAIL_EXCEP(X) SYS_FAIL_EXCEP_##X,
SYS_FAIL_EXCEPTIONS
#undef SYS_FAIL_EXCEP
};

static const HAL_Map_Text_ID_t system_failure_text_id_map[] = {
#define SYS_FAIL_EXCEP(X) { SYS_FAIL_EXCEP_##X, #X },
SYS_FAIL_EXCEPTIONS
#undef SYS_FAIL_EXCEP
};

如果使用 enum Not Acceptable ,并且必须使用 #define 宏,则此方法的替代方法是使用文本文件来捕获这些异常定义。然后,使用脚本,您可以解析文本文件并为宏定义和字符串表生成适当的 C 代码。

关于c - 易于维护的标识符与文本表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452046/

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