在编译时检查枚举值

问题描述 投票:2回答:2

我想在编译时检查静态initalizers。我正在从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 );

谢谢你们。

c compiler-construction assert
2个回答
3
投票

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

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

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


0
投票

你是积极的EQADC_CHAN_MAX == 62?你能放一个printf("%d", EQADC_CHAN_MAX)来确定吗?

© www.soinside.com 2019 - 2024. All rights reserved.