我想在编译时检查静态初始化器。我正在从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 );
谢谢大家。
答案 0 :(得分:3)
查看this thread讨论如何在编译时评估sizeof,而在编译之前评估指令,因此依赖于sizeof的指令将不起作用。
如果这没有用,那么你可以使用-p选项运行编译步骤,或者编译器的编译步骤,以产生预处理器输出吗?这可能会澄清为什么第二个断言中的谓词不能评估你的预期。
另外,为什么你断言该数组的大小不 62?
答案 1 :(得分:0)
你对EQADC_CHAN_MAX == 62
表示肯定吗?你能加一个printf("%d", EQADC_CHAN_MAX)
来确定吗?