2010-12-01 94 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)来确定吗?