2013-02-28 50 views
0

我有這樣的定義:定義與命令的#define不MISRA遵守規則的陣列

static const char* STRING_ARRAY[NUM_UNITS] = STRING_ARRAY_VALUES; 

#define STRING_ARRAY_VALUES     \ 
{ "n/a",         \ 
    "bool",         \ 
    ...          \ 
} 

不幸的是,它不是與MISRA-C++規則8-5-2遵守:

"MISRA-C++ Rule 8-5-2 (required): Braces shall be used to indicate and match the 
structure in the non-zero initialization of arrays and structures." 

任何人都可以請解釋爲什麼它不符合?我認爲的#define命令打開定義是這樣的:

static const char* STRING_ARRAY[NUM_UNITS] = {"n/a", "bool",...} 

這與MISRA遵守規則。

有沒有辦法讓這符合MISRA,同時保持#define

+0

這個聲明在哪裏? – chris 2013-02-28 15:05:14

+0

該數組位於.cpp文件中,#define位於.h文件中。 – 2013-02-28 15:07:28

+0

如果我省略省略號,則聲明'NUM_UNITS',並將其全部放在cpp文件中,對我來說工作正常。 – chris 2013-02-28 15:15:00

回答

2

有兩個可能的原因:

  • 無論您MISRA檢查器壞了。我用LDRA Testbed測試了你的代碼,它不會產生任何錯誤。
  • 或者我猜NUM_UNITS可能與傳遞給數組的指針數不匹配。我不清楚這是否違反了MISRA規則。你可以添加一個靜態斷言sizeof(STRING_ARRAY)/sizeof(const char*) == NUM_UNITS,這是一個很好的做法,不管MISRA如何。
+0

是的,我認爲你是對的。定義中缺少一個逗號,所以我的猜測是NUM_UNITS參數不是NUM_UNITS參數。儘管如此,由於缺少逗號,我預計它會在編譯階段失敗。 – 2013-03-03 12:14:21

+0

@ or.nomore它不會失敗,因爲兩個字符串文字「hello」「world」'在這個例子中彼此挨着寫,或者在源代碼中有一個新行,會被pre處理器合併爲一個項目「helloworld」。這是一種語言功能,因此程序員不需要在單一源代碼行中寫入過長的字符串。 – Lundin 2013-03-04 07:21:59

+0

**我會期待它在編譯階段失敗** - 不......它是合法的,句法C/C++儘管不合邏輯 - 這就是爲什麼MISRA規則存在! – Andrew 2018-01-15 16:14:24