2009-01-09 13 views
29

tengo el código fuente de una aplicación escrita en C++ y sólo quiero comentar algo usando:error: nombres de macro deben ser identificadores utilizando #ifdef 0

#ifdef 0 
... 
#endif 

Y me sale este error

error: macro names must be identifiers

¿Por qué sucede esto?

+0

Creo que has olvidado tu memoria; #ifdef 0 es un error en C y en C++. –

+4

Tiene razón, me equivoqué, no funciona en C, no voy a eliminar la pregunta porque tal vez alguien en el futuro cometa el mismo error. – Eduardo

+0

@Eduardo Gracias por no eliminar la pregunta. – kartik

Respuesta

54

La directiva #ifdef se utiliza para comprobar si se define un símbolo de preprocesador. la norma (C11 6.4.2 Identifiers) ordena que los identificadores no deben comenzar 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 utilizar el pre-procesador para bloquear el código es:

#if 0 
: : : 
#endif 

También puede utilizar:

#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST 
: : : 
#endif 

pero hay que estar seguro de que los símbolos se no pueden establecer de forma inadvertida por el código othe r que el tuyo 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.

+0

Tengo un código que compilo ocasionalmente compilado con -DNEVER_USED. No he investigado por qué, odio adivinar. –

+0

@Pax: en realidad, es muy poco probable que el compilador de C permita la notación, sería erróneo si lo hiciera. Ver también mi comentario a la pregunta. Sugiero eliminar su oración "Es probable que ...". –

+0

No todos los compiladores de C cumplen con ANSI. He usado muchos compiladores incrustados que permiten todo tipo de trucos así. Pero lo arreglaré. – paxdiablo

11

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

#if 0 
... 
#endif 
5

Este error también puede ocurrir si no está siguiendo las reglas Marco

Como

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

Motivo: Macro debe comenzar con una letra, no es un número

Cambiar para

#define ONE_KILOBYTE 1024 // This resolves 
1

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

#define <stdio.h> 

... en lugar de ...

#include <stdio.> 
2
#ifdef 0 
... 
#endif 

# ifdef espera una macro en lugar de la expresión utilizando constante o expresión

#if 0 
... 
#endif 

o

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

si #ifdef se utiliza el sí informes este error

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

Dónde #ifdef esperan una macro en lugar de expresssion macro

-1

A veces, si copia un código de un documento PDF y pegarlo en su editor; Se esconden extraños personajes. Entonces este error también puede ocurrir en esa situación.

Tenga cuidado, debe reemplazar todos los espacios en blanco copiados por los nuevos y también hacer lo mismo con los retornos de carro.

Cuestiones relacionadas