Проверка значений перечисления во время компиляции - PullRequest
2 голосов
/ 01 декабря 2010

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

Спасибо всем.

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Посмотрите на этот поток , в котором обсуждается, как sizeof оценивается при компиляции, в то время как директивы оцениваются до компиляции, поэтому директивы, которые зависят от sizeof, работать не будут.

Если это не поможет, то можете ли вы выполнить шаг компиляции с параметром -p или каким-либо другим параметром для компилятора, чтобы получить вывод перед процессором?Это может прояснить, почему предикат в вашем втором утверждении не соответствует ожидаемому.

Кроме того, почему вы утверждаете, что размер этого массива равен , а не 62?

0 голосов
/ 01 декабря 2010

Вы уверены, что EQADC_CHAN_MAX == 62? Можете ли вы поставить printf("%d", EQADC_CHAN_MAX), чтобы убедиться?

...