我想在編譯時檢查靜態初始化器。我正在從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);
謝謝大家。
你得到了什麼斷言? – AlastairG 2010-12-01 14:52:38
您是如何定義CASSERT的? – 2010-12-01 15:30:15