gpt4 book ai didi

在编译时检查枚举值

转载 作者:行者123 更新时间:2023-12-04 06:40:23 25 4
gpt4 key购买 nike

我想在编译时检查静态初始化器。我正在实现来自 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 );

谢谢你们。

最佳答案

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

如果这没有帮助,那么您是否可以使用 -p 选项或任何适用于您的编译器的选项运行编译步骤以生成预处理器输出?这可能会澄清为什么您的第二个断言中的谓词不符合您的期望。

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

关于在编译时检查枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4325494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com