2009-01-09 26 views
29

ich den Quellcode einer Anwendung haben in C++ geschrieben und ich möchte nur etwas kommentieren mit:Fehler: Makronamen müssen Bezeichner sein #ifdef mit 0

#ifdef 0 
... 
#endif 

Und ich bekomme diese Fehlermeldung

error: macro names must be identifiers

Warum passiert das?

+0

Ich glaube, du hast dich geirrt; #ifdef 0 ist ein Fehler in C sowie C++. –

+4

Sie haben Recht, ich habe falsch geschrieben, es funktioniert nicht in C, ich werde nicht die Frage löschen, weil vielleicht jemand in der Zukunft den gleichen Fehler macht. – Eduardo

+0

@Eduardo Danke, dass du die Frage nicht gelöscht hast. – kartik

Antwort

54

Die #ifdef Direktive wird benutzt, zu überprüfen, ob ein Präprozessorsymbol definiert ist. Die Standard (C11 6.4.2 Identifiers) Mandate, die Bezeichner darf nicht mit einer Ziffer beginnen:

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 

Die richtige Form der Pre-Prozessor für die Verwendung von Code zu blockieren, ist:

#if 0 
: : : 
#endif 

Sie auch verwenden können:

#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST 
: : : 
#endif 

, aber Sie müssen sicher sein, dass die Symbole nicht versehentlich von Code othe eingestellt werden r als dein eigenes. Mit anderen Worten, verwenden Sie nicht so etwas wie NOTUSED oder DONOTCOMPILE, die andere auch verwenden können. Um sicher zu sein, sollte die Option #if bevorzugt werden.

+0

Ich habe etwas Code, den ich gelegentlich kompiliere, der mit -DNEVER_USED kompiliert wird. Ich habe nicht untersucht, warum - ich hasse es zu erraten. –

+0

@Pax: Eigentlich ist es sehr unwahrscheinlich, dass der C-Compiler die Notation erlaubt - es wäre falsch, wenn es so wäre. Siehe auch meinen Kommentar zu der Frage. Ich schlage vor, den Satz "Es ist wahrscheinlich, dass ..." zu entfernen. –

+0

Nicht alle C-Compiler sind ANSI-konform. Ich habe viele eingebettete Compiler verwendet, die alle möglichen Tricks zulassen. Aber ich werde es reparieren. – paxdiablo

11

Verwenden Sie Folgendes, um einen Ausdruck auszuwerten (Konstante 0 wird zu false ausgewertet).

#if 0 
... 
#endif 
5

Dieser Fehler kann auch auftreten, wenn Sie nicht die marco Regeln

folgen

Wie

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

Grund: Makro mit einem Buchstaben beginnen sollte, keine Zahl

Wechsel zu

#define ONE_KILOBYTE 1024 // This resolves 
1

Beachten Sie, dass Sie diesen Fehler auch treffen können, wenn Sie versehentlich Folgendes eingeben:

#define <stdio.h> 

... statt ...

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

# ifdef ein Makro erwarten eher als Ausdruck wenn Konstante oder ein Ausdruck mit

#if 0 
... 
#endif 

oder

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

wenn #ifdef die es Berichte diesen Fehler verwendet wird

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

Wo #ifdef ein Makro erwarten eher als Makro express

-1

Manchmal, wenn Sie einen Code aus einem PDF-Dokument und fügen Sie ihn in Ihren Editor kopieren; Ein verstecken seltsame Zeichen sind enthalten. So kann dieser Fehler auch in dieser Situation auftreten.

Seien Sie vorsichtig, Sie müssen alle Leerstellen ersetzen, die für neue kopiert werden, und auch dasselbe mit Wagenrücklauf.

Verwandte Themen