Enum-Werte zur Kompilierzeit prüfen - c, Compiler-Konstruktion, assert

Ich möchte statische Initalisierer zur Kompilierzeit überprüfen. Ich implementiere das Makro CASSERT () von diese Frage.

Jetzt habe ich diese "seltsame" Situation

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;

Und ich habe eine Struktur wie folgt initialisiert:

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

Was mir komisch ist ... ist die folgende Aussage

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

funktioniert gut und "passt" tatsächlich (d. h. kompiliert ohne Fehler). Stattdessen:

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

nicht (d. h. es erzeugt tatsächlich eine Assertion und stoppt den Compiler.

Ich versuche herauszufinden, warum das passiertDas Problem hängt mit dem Wert von EQADC_CHAN_MAX zusammen, der zur Kompilierungszeit nicht bekannt ist und ein Enum-Wert ist. Wenn das der Fall ist, kann ich diese Erklärung noch immer nicht verstehen

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX]

tatsächlich instanziiert die richtige Größe für das Array ... Jede Hilfe, wie ich dies (besser) umsetzen kann, wird sehr geschätzt.

Bearbeiten: mein Fehler. Die korrekte Syntax ist

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

Achten Sie außerdem darauf, das Array auf diese Weise zu deklarieren:

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

Die Größe von EQADC_CHAN_MAX-Elementen wird tatsächlich zugewiesen, auch wenn die Anzahl von initialisiert Elemente sind eigentlich nicht korrekt. Der richtige Weg, dies zu implementieren, ist:

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

Danke euch allen.

Antworten:

2 für die Antwort № 1

Schau es dir an Dieser Thread.

Wenn das nicht hilft, dann kannst du deinen laufen lassenKompilierungsschritt mit der Option -p oder was auch immer es für Ihren Compiler ist, um Pre-Prozessor-Ausgabe zu erzeugen? Das könnte verdeutlichen, warum das Prädikat in Ihrer 2. Behauptung nicht das bewertet, was Sie erwarten.

Auch, warum behaupten Sie, dass die Größe dieses Arrays ist nicht 62?


0 für die Antwort № 2

Bist du das positiv? EQADC_CHAN_MAX == 62? Kannst du einen einlegen? printf("%d", EQADC_CHAN_MAX) sichergehen?