Error: los nombres de macro deben ser identificadores con #ifdef 0
-
06-07-2019 - |
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?
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.>