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

时间:2013-08-26 19:58:52

标签: c identifier lookup-tables c-strings

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

#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处理器的目标系统。)

1 个答案:

答案 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代码。