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 ?


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 --------|

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.


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!


Entschuldigung, das Codebeispiel falsch gelesen! Ich dachte, es begann mit #ifdef QUESTION
-Jan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.