Erreur: les noms de macro doivent être des identificateurs utilisant #ifdef 0
-
06-07-2019 - |
Question
J'ai le code source d'une application écrite en C ++ et je veux juste commenter quelque chose en utilisant:
#ifdef 0
...
#endif
Et j'obtiens cette erreur
erreur: les noms de macro doivent être des identificateurs
Pourquoi cela se produit-il?
La solution
La directive #ifdef permet de vérifier si un symbole de préprocesseur est défini. La norme ( C11 6.4.2 Identifiants
) 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 d'utilisation du préprocesseur pour bloquer le code est la suivante:
#if 0
: : :
#endif
Vous pouvez également utiliser:
#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST
: : :
#endif
mais vous devez être sûr que les symboles ne seront pas 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 personnes pourraient également utiliser. Pour plus de sécurité, l'option #if
doit être préférée.
Autres conseils
Utilisez ce qui suit pour évaluer une expression (la constante 0 est définie sur false).
#if 0
...
#endif
Cette erreur peut également se produire si vous ne suivez pas les règles marco
J'aime
#define 1K 1024 // Macro rules must be identifiers error occurs
Raison: la macro doit commencer par une lettre et non un chiffre
Changer en
#define ONE_KILOBYTE 1024 // This resolves
#ifdef 0
...
#endif
#ifdef attend une macro plutôt qu'une expression en utilisant constante ou 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 expression de macro
Notez que vous pouvez également rencontrer cette erreur si vous tapez accidentellement:
#define <stdio.h>
... au lieu de ...
#include <stdio.>