2011-02-10 7 views
5

En algún archivo de cabecera que no puedo modificar Tengo el siguiente conjunto de define:¿Se permite el guión bajo en las etiquetas de mayúsculas y minúsculas?

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

Entonces, en mi código que ellos utilizan en el interruptor:

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

    case FLAG2: 
    .... 
} 

Como resultado, informa Coverity en 2 defectos por cada etiqueta de caja:

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é pasa con estas etiquetas de caja? ¿Viola los estándares de C?

+1

No debería. 'caso 4 * (1 + 2):' debería ser válido también. –

+9

¿Cuál es el guión bajo en 0x0000_0001? Eso no es válido C ... –

+1

Si quita los guiones bajos en las constantes hexadecimales, debería estar bien. –

Respuesta

3

Sí, es el subrayado que está causando problemas. Fwiw, aquí están las secciones relevantes de la norma lenguaje C (proyecto de n1256):

  • § 6.4.4.1 constantes enteras: define la estructura de constantes enteras y muestra que _ no es un carácter válido para una constante entera;
  • § 6.6 Expresiones constantes: define las restricciones en expresiones constantes;
  • § 6.8.4.2 La declaración switch: define las restricciones en las etiquetas case en una declaración switch.
+0

+1 para referencia al doc y párrafos – pmod

2

Cree que espera el ) cuando encuentra el _ que no es válido en notación hexadecimal.

El compilador debe en realidad se quejan de esta manera:

error: invalid suffix "_0001" on integer constant 

case etiquetas también pueden contener paréntesis:

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

Eso no es un sufijo (de acuerdo con la regla 'maximal munch'); es un identificador que comienza con '_' que es adyacente a la constante hexadecimal, y no se puede escribir un número seguido de un identificador sin un operador interviniente. –

+0

En realidad, este guión bajo es aceptado por el compilador sin errores/advertencias u otras consecuencias negativas ... – pmod

+0

@Jonathan @Pmod No es mi gcc, no. Le di '0xdead_beef' para que" masticara "y se quejó con el mismo mensaje que publiqué en la respuesta ... [Lookie aquí] (http://codepad.org/Bc06MUzJ) –

5

Sí, se le permite tener paréntesis. Lo que usted no es permitido tener es un número como 0x0000_0001.

No es un número hexadecimal válido, probablemente tendrá que eliminar el carácter _.

Cuestiones relacionadas