Können # wenn Preprozessor-Direktiven in C ++ verschachtelt werden?

84

Ich habe eine Frage zu Pre-Prozessor-Direktiven in c ++:

Zum Beispiel:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

Können wir es auf diese Weise verwenden und kann der C ++ - Compiler mit dem ifndefund endifauf die richtige Weise übereinstimmen ?

Brian Tompsett - 汤 莱恩
quelle
1
Sie können Bedingungen verschachteln und ein Makro von einem anderen aufrufen, aber Sie können Makros nicht direkt verschachteln, z. B. #define AAA #define XXX- es funktioniert nicht richtig.
SF.
2
Da eine C-Frage nur als Duplikat dieser Frage geschlossen wurde, möchte ich darauf hinweisen, dass die Regeln für den C- und C ++ - Präprozessor zumindest in Bezug auf diese Frage dieselben sind.
Keith Thompson

Antworten:

112

Ja wir können. Die #endifAnweisung stimmt mit der vorherigen #if #ifdefoder #ifndefusw. überein, für die es keine entsprechende Anweisung gibt #endif.

z.B

#if  ----------|
#if  -----|    |
#endif ---|    |
#endif --------|
Armen Tsirunyan
quelle
Wir haben hier zwei #endif, also stimmt das erste #endif mit dem zweiten #ifndef überein?
Es wird nicht mit dem vorherigen übereinstimmen; das würde bedeuten, dass wir sie nicht nisten könnten.
Fred Foo
49

Ja, Sie können verschachteln #if/ #endifblockieren. Einige C-Codierungsstile empfehlen Ihnen, zu schreiben

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

Verwenden von Leerzeichen, um die Verschachtelungsebene anzugeben.

Fred Foo
quelle
5
+1 für das Verschachtelungsbit, es hilft manchmal sehr mit Klarheit.
André Caron
Warum sollten Sie Leerzeichen einfügen? warum nicht einfach die#ifdef
Jahid
3
Ich wusste nicht einmal, dass Leerzeichen zwischen #und Präprozessor-Direktiven erlaubt sind. Vielen Dank für diesen Tipp!
AlexR
0

In Ihrem Code wird der Abschnitt #ifndef QUESTION verworfen, es sei denn, Sie haben #undef QUESTION.

Viel Glück!

Bert-Jan
quelle
Entschuldigung, das Codebeispiel falsch gelesen! Ich dachte, es begann mit #ifdef QUESTION
-Jan