Я хотел бы проверить статические инициализаторы во время компиляции. Я реализую макрос 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 );
Спасибо всем.