2011-02-10 1 views
5

Dans certains fichier d'en-tête que je ne peux pas modifier je l'ensemble des defines suivantes:Le soulignement est-il autorisé dans les étiquettes de cas?

#define FLAG1      (0x0000_0001) 
#define FLAG2      (0x0000_0002) 
... 

Alors, dans mon code que je les utilise dans le commutateur:

switch (aaa) { 
    case FLAG1: 
    .... 

    case FLAG2: 
    .... 
} 

En conséquence, Coverity rapports sur 2 défauts par étiquette de cas:

RW.EXP_RPAREN: 
Event exp_rparen: expected a ")" 

RW.CASE_LABEL_CONFLICT: 
Event case_label_conflict: case label value has already appeared in 
this switch at line XX 

Qu'est-ce qui ne va pas avec ces étiquettes? Est-ce que cela viole les normes C?

+1

Il ne devrait pas. 'case 4 * (1 + 2):' devrait aussi être valide. –

+9

Quel est le trait de soulignement dans 0x0000_0001? Ce n'est pas valide C ... –

+1

Si vous supprimez les traits de soulignement dans les constantes hexadécimales, cela devrait être bon. –

Répondre

3

Oui, c'est le trait de soulignement qui cause des problèmes. FWIW, voici les sections pertinentes de la norme de langage C (projet n1256):

  • § 6.4.4.1 Entier Constantes: définit la structure des constantes entières et montre que _ est pas un caractère valide pour une constante entière;
  • § 6.6 Expressions constantes: définit les restrictions sur les expressions constantes; 6.8.2.2 L'instruction switch: définit les restrictions sur les étiquettes case dans une instruction switch.
+0

+1 pour référence à doc et paragraphes – pmod

2

Il pense qu'il attend le ) lorsqu'il trouve le _ qui n'est pas valide en notation hexadécimale.

Le compilateur devrait effectivement se plaindre comme ceci:

error: invalid suffix "_0001" on integer constant 

étiquettes case peuvent bien contenir entre parenthèses:

switch(number) { 
    // no way to determine operator 
    // precedence without parens here 
    case 2*(1+2): 
} 
+0

Ce n'est pas un suffixe (selon la règle 'maximale munch'); c'est un identifiant commençant par '_' qui est adjacent à la constante hexadécimale - et vous ne pouvez pas écrire un nombre suivi d'un identifiant sans opérateur intermédiaire. –

+0

En fait, ce trait de soulignement est accepté par le compilateur sans erreurs/avertissements ou d'autres conséquences négatives ... – pmod

+0

@Jonathan @Pmod Pas mon gcc, ne le faites pas. Je lui ai donné '0xdead_beef' pour" grignoter "et il s'est plaint avec exactement le même message que j'ai posté dans la réponse ... [Lookie here] (http://codepad.org/Bc06MUzJ) –

5

Oui, vous êtes autorisé à avoir entre parenthèses. Ce que vous ne sont pas autorisé à avoir est un nombre comme 0x0000_0001.

Ce n'est pas un nombre hexadécimal valide, vous devrez probablement supprimer le caractère _.

Questions connexes