web-dev-qa-db-fra.com

Erreur: les noms de macro doivent être des identifiants utilisant #ifdef 0

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?

34
Eduardo

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.

60
paxdiablo

Utilisez ce qui suit pour évaluer une expression (la constante 0 est évaluée à faux).

#if 0
 ...
#endif
13
tvanfosson

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 
5
Fooo
#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

2
Deepak Reddy

Notez que vous pouvez également rencontrer cette erreur si vous tapez accidentellement:

#define <stdio.h>

...au lieu de...

#include <stdio.>
1
Drew Noakes