在编译时检查枚举值

时间:2010-12-01 14:44:03

标签: c compiler-construction assert

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

实际上实例化了数组的正确大小...... 关于我如何(更好)实现这一点的任何帮助都非常感谢。

编辑:我的错。正确的语法是

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 );

谢谢大家。

2 个答案:

答案 0 :(得分:3)

查看this thread讨论如何在编译时评估sizeof,而在编译之前评估指令,因此依赖于sizeof的指令将不起作用。

如果这没有用,那么你可以使用-p选项运行编译步骤,或者编译器的编译步骤,以产生预处理器输出吗?这可能会澄清为什么第二个断言中的谓词不能评估你的预期。

另外,为什么你断言该数组的大小 62?

答案 1 :(得分:0)

你对EQADC_CHAN_MAX == 62表示肯定吗?你能加一个printf("%d", EQADC_CHAN_MAX)来确定吗?