我想在编译时检查静态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 );
谢谢你们。
看看this thread讨论了在编译时如何评估sizeof,同时在编译之前评估指令,因此依赖于sizeof的指令将不起作用。
如果这没有用,那么你可以使用-p选项运行编译步骤,或者编译器的任何编译步骤,以产生预处理器输出吗?这可能会澄清为什么第二个断言中的谓词不能评估你的期望。
另外,为什么断言该数组的大小不是62?
你是积极的EQADC_CHAN_MAX == 62
?你能放一个printf("%d", EQADC_CHAN_MAX)
来确定吗?