在我们的项目中,我们有数百个用于错误代码的标识符,例如:
#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标准。
(我们正在使用带有IAR嵌入式工作台的C89和使用ARM7处理器的目标系统。)
答案 0 :(得分:1)
您可以使用宏系统来帮助创建单点标识符更新,这也将更新您的字符串。但是,此方案将您的标识符从宏转换为枚举常量。我正在打字,因此未经测试:
#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
是不可接受的,并且您必须使用#define
宏,则此方法的替代方法是使用文本文件来捕获这些异常定义。然后,使用脚本,您可以解析文本文件并为宏定义和字符串表生成适当的C代码。