2013-08-26 53 views
0

在我們的項目中,我們有數百個標識符用於錯誤代碼,例如:易於維護表與文本

#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 Embedded Workbench使用ARM7處理器的目標系統。)

+0

如果名稱本身是一個可以接受的字符串,也許你可以將它串聯起來。 – Jiminion

+0

爲什麼表格不同步,而不是錯過一個條目?有時會在中間添加條目嗎? – Jiminion

回答

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代碼。

+0

我們放棄了'枚舉'因爲它們是最短容量的有符號值,並且它們不是像C++那樣的唯一類型。 –

+0

我不認爲宏在後一點上提供任何額外的好處。我用另一種方式更新了答案。 – jxh