2010-12-01 30 views
1

Je voudrais vérifier les initalizers statiques au moment de la compilation. J'implémente la macro CASSERT() de this question.Vérification des valeurs enum au moment de la compilation

Maintenant, je cette situation "étrange"

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; 

Et j'avoir une structure initialisée comme ceci:

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

Ce qui est étrange (pour moi ...) est que les éléments suivants instruction

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

fonctionne bien, et effectivement "passe" (ie compile sans erreurs). Au lieu de cela, ceci:

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

ne fonctionne pas (il génère en fait une affirmation, et arrête le compilateur

Essayer de comprendre pourquoi cela se produit, je pense que le problème est lié à la valeur. EQADC_CHAN_MAX, qui ne sait pas au moment de la compilation, étant une valeur enum. Si tel est le cas, je ne comprends toujours pas pourquoi cette déclaration

const t_EQADC_Pin_Config EQADC_xPinConfig[EQADC_CHAN_MAX] 

instancie la bonne taille pour le tableau ... Tous h elp sur comment je peux (mieux) mettre en œuvre ceci est vraiment apprécié.

Modifier: ma faute. La syntaxe correcte est

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

De plus, attention que la déclaration du tableau de cette façon:

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

attribue en fait la taille des éléments EQADC_CHAN_MAX, même si le nombre de initialisé éléments ne sont pas réellement correct . Ainsi, la bonne façon de mettre en œuvre c'est:

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

Merci à tous.

+0

Quelle affirmation obtenez-vous? – AlastairG

+0

Comment définissez-vous CASSERT? –

Répondre

2

Jetez un oeil à this thread.

Si cela ne vous aide pas alors pouvez-vous exécuter votre étape de compilation avec l'option -p, ou quoi que ce soit pour votre compilateur, pour produire une sortie de pré-processeur? Cela pourrait clarifier pourquoi le prédicat dans votre deuxième assertion n'évalue pas à ce que vous attendez.

Aussi, pourquoi affirmez-vous que la taille de ce tableau est pas 62?

0

Êtes-vous certain que EQADC_CHAN_MAX == 62? Pouvez-vous mettre dans un printf("%d", EQADC_CHAN_MAX) pour vous assurer?

+0

Vous pensez qu'il a défini la macro CASSERT() à l'envers? – AlastairG