Sprawdzanie wartości wyliczeniowych podczas kompilacji - c, budowa kompilatora, assert

Chciałbym sprawdzić statyczne initalizery w czasie kompilacji. Wdrażam makro CASSERT () z to pytanie.

Teraz mam tę "dziwną" sytuację

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;

I mam strukturę zainicjowaną w następujący sposób:

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = {
{ 123 },  /* EQADC_CHAN_A_00 */
{ 321 },  /* EQADC_CHAN_A_01 */
...       /* Others */
};

Co jest dziwne (dla mnie ...) jest następujące stwierdzenie

CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) != 62 );

działa dobrze, a właściwie "przechodzi" (tzn. kompiluje się bez błędów). Zamiast tego:

CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) != EQADC_CHAN_MAX );

nie (to znaczy faktycznie generuje asercję i zatrzymuje kompilator.

Próbuję się domyślić, dlaczego tak się dzieje, jak sądzęże problem jest związany z wartością EQADC_CHAN_MAX, która nie jest znana w czasie kompilacji, jest wartością wyliczeniową. Jeśli tak jest, nadal nie rozumiem, dlaczego ta deklaracja

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX]

faktycznie tworzy odpowiedni rozmiar tablicy ... Każda pomoc dotycząca tego, jak mogę (lepiej) zaimplementować to jest naprawdę doceniana.

Edytować: moja wina. Poprawna składnia jest

CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) == EQADC_CHAN_MAX );

Ponadto zwróć uwagę na to, jak deklarujesz tablicę w ten sposób:

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] = { Initializers ....}

faktycznie przydziela rozmiar elementów EQADC_CHAN_MAX, nawet jeśli liczba zainicjowany elementy nie są właściwie poprawne. Tak więc właściwym sposobem wdrożenia tego jest:

const t_EQADC_Pin_Config EQADC_xPinConfig[] = { Initializers ....}
CASSERT(( sizeof(EQADC_xPinConfig)/sizeof(EQADC_xPinConfig[0]) ) == EQADC_CHAN_MAX );

Dziękuję wam wszystkim.

Odpowiedzi:

2 dla odpowiedzi № 1

Spójrz na ten wątek.

Jeśli to nie pomoże, to możesz uruchomićkrok kompilacji z opcją -p, czy jakakolwiek jest ona dla twojego kompilatora, aby wyprodukować wyjście pre-procesora? To może wyjaśnić, dlaczego predykat w twoim drugim stwierdzeniu nie ocenia tego, czego się spodziewasz.

Ponadto, dlaczego twierdzisz, że rozmiar tej tablicy jest nie 62?


0 dla odpowiedzi nr 2

Czy jesteś tego pewien? EQADC_CHAN_MAX == 62? Czy umiesz włożyć printf("%d", EQADC_CHAN_MAX) upewniać się?


Menu