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?

Était-ce utile?

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.>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top