我想在编译时检查静态初始化器。我正在从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