J'ai le code source d'une application écrit en C++ et je veux juste commenter quelque chose en utilisant:
#ifdef 0
...
#endif
Et je reçois cette erreur
erreur: les noms de macro doivent être des identifiants
Pourquoi cela arrive-t-il?
La directive #ifdef est utilisée pour vérifier si un symbole de préprocesseur est défini. La norme (C11 6.4.2 Identifiers
) stipule que les identifiants ne doivent pas commencer par un chiffre:
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 forme correcte pour utiliser le pré-processeur pour bloquer le code est:
#if 0
: : :
#endif
Vous pouvez aussi utiliser:
#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST
: : :
#endif
mais vous devez être sûr que les symboles pas seront définis par inadvertance par un code autre que le vôtre. En d'autres termes, n'utilisez pas quelque chose comme NOTUSED
ou DONOTCOMPILE
que d'autres peuvent également utiliser. Pour être sûr, le #if
l'option doit être préférée.
Utilisez ce qui suit pour évaluer une expression (la constante 0 est évaluée à faux).
#if 0
...
#endif
Cette erreur peut également se produire si vous ne suivez pas les règles marco
Comme
#define 1K 1024 // Macro rules must be identifiers error occurs
Raison: la macro doit commencer par une lettre, pas un chiffre
Remplacer par
#define ONE_KILOBYTE 1024 // This resolves
#ifdef 0
...
#endif
#ifdef attend une macro plutôt qu'une expression lors de l'utilisation d'une constante ou d'une expression
#if 0
...
#endif
ou
#if !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif
si #ifdef est utilisé, il signale cette erreur
#ifdef !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif
Où #ifdef attend une macro plutôt qu'une macro expression
Notez que vous pouvez également rencontrer cette erreur si vous tapez accidentellement:
#define <stdio.h>
...au lieu de...
#include <stdio.>