2010-12-01 96 views
1

我想在編譯時檢查靜態初始化器。我正在從this question實現宏CASSERT()。現在在編譯時檢查枚舉值

,我有這種「奇怪」的情況

typedef enum 
{ 
    EQADC_CHAN_A_00 = 0, 
    EQADC_CHAN_A_01, 
    EQADC_CHAN_A_02, 
    EQADC_CHAN_A_03, 
    EQADC_CHAN_A_04, 
    ...     // Others 
    EQADC_CHAN_MAX  // EQADC_CHAN_MAX = 62 

} eQadc_tInputBiosId; 

而且我有這樣初始化的結構:

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = { 
    { 123 }, /* EQADC_CHAN_A_00 */ 
    { 321 }, /* EQADC_CHAN_A_01 */ 
    ...  /* Others */ 
}; 

有什麼奇怪(我...)是以下聲明

CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) != 62); 

工作正常,實際上「通過」(即編譯沒有錯誤)。 相反,這樣的:

CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) != EQADC_CHAN_MAX); 

沒有(即它實際上產生斷言,並停止編譯

試圖找出爲什麼出現這種情況,我覺得現在的問題是有關的價值。 EQADC_CHAN_MAX,未在編譯時已知,作爲一個枚舉值。如果是這樣的話,我仍然不明白爲什麼這個聲明

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] 

實際實例化的正確尺寸爲陣... 任何H elp我怎麼能(更好)實現這個真的很感激。

編輯:我的錯。正確的語法是

CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) == EQADC_CHAN_MAX); 

此外,要注意的聲明數組是這樣的:

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = { Initializers ....} 

實際分配EQADC_CHAN_MAX元素的大小,即使數初始化元素實際上並不正確。 因此,要實現這個正確的方法是:

const t_EQADC_Pin_Config EQADC_xPinConfig[] = { Initializers ....} 
CASSERT((sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0])) == EQADC_CHAN_MAX); 

謝謝大家。

+0

你得到了什麼斷言? – AlastairG 2010-12-01 14:52:38

+0

您是如何定義CASSERT的? – 2010-12-01 15:30:15

回答

2

看一看this thread

如果這樣做沒有幫助,那麼您可以使用-p選項運行編譯步驟,還是運行編譯器的任何步驟來生成預處理器輸出?這可能會澄清爲什麼你的第二個斷言中的謂詞不符合你的期望。

另外,你爲什麼斷言該數組的大小是而不是 62?

0

你是肯定的EQADC_CHAN_MAX == 62?你可以輸入printf("%d", EQADC_CHAN_MAX)來確定嗎?