Pregunta

Tengo el código fuente de una aplicación escrita en C ++ y solo quiero comentar algo usando:

#ifdef 0
...
#endif

Y recibo este error

  

error: los nombres de macro deben ser identificadores

¿Por qué sucede esto?

¿Fue útil?

Solución

La directiva #ifdef se utiliza para verificar si se define un símbolo de preprocesador. El estándar ( C11 6.4.2 Identifiers ) exige que los identificadores no comiencen con un dígito :

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined characters>
nondigit: one of
    _ a b c d e f g h i j k l m
    n o p q r s t u v w x y z
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z
digit: one of
    0 1 2 3 4 5 6 7 8 9

La forma correcta de usar el preprocesador para bloquear el código es:

#if 0
: : :
#endif

También puedes usar:

#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST
: : :
#endif

pero debe estar seguro de que los símbolos no se establecerán inadvertidamente por otro código que no sea el suyo. En otras palabras, no use algo como NOTUSED o DONOTCOMPILE que otros también pueden usar. Para estar seguro, se debe preferir la opción #if .

Otros consejos

Use lo siguiente para evaluar una expresión (la constante 0 se evalúa como falsa).

#if 0
 ...
#endif

Este error también puede ocurrir si no sigue las reglas del marco

Me gusta

#define 1K 1024 // Macro rules must be identifiers error occurs

Motivo: la macro debe comenzar con una letra, no un número

Cambiar a

#define ONE_KILOBYTE 1024 // This resolves 
#ifdef 0
...
#endif

#ifdef espera una macro en lugar de una expresión cuando se usa constante o expresión

#if 0
...
#endif

o

#if !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

si se usa #ifdef, informa este error

#ifdef !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

Donde #ifdef espera una macro en lugar de una macroexpresión

Tenga en cuenta que también puede detectar este error si escribe accidentalmente:

#define <stdio.h>

... en lugar de ...

#include <stdio.>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top