Können boolesche Operatoren mit dem Präprozessor verwendet werden?

74

Ich frage mich, ob es möglich ist, eine Präprozessor-ODER- oder UND-Anweisung zu haben. Ich habe diesen Code, unter dem ich _DEBUGoder _UNIT_TESTTags (?) Ausführen möchte .

Was ich will, ist so etwas wie das Folgende:

#if _DEBUG || _UNIT_TEST
  //Code here
#endif

Wenn dies nicht möglich ist, gibt es eine Problemumgehung, um dasselbe zu erreichen, ohne den Code mit a duplizieren zu müssen #elseif?

Wesley
quelle

Antworten:

104
#if defined _DEBUG || defined _UNIT_TEST 
  //Code here 
#endif 

Sie können auch AND- und NOT-Operatoren verwenden. Zum Beispiel:

#if !defined _DEBUG && defined _UNIT_TEST 
  //Code here 
#endif 
Kirill V. Lyadvinsky
quelle
14

#ifNimmt einen beliebigen C ++ - Ausdruck vom Integraltyp (1), den der Compiler zur Kompilierungszeit auswerten kann. Also ja, Sie können verwenden ||und &&, solange Sie verwenden defined(SOMETHING), um auf Definiertheit zu testen.

(1): Nun, es ist etwas eingeschränkter als das; Für das Wesentliche siehe die Einschränkungen hier (unter "mit diesen zusätzlichen Einschränkungen" ).

Roman Starkov
quelle
Die Verbindung ist unterbrochen.
Nacnudus
2
Die Verwendung von "definiert (ETWAS)" ist nicht immer das, was Sie wollen. Zum Beispiel könnte es sein, dass das Symbol als '0' oder als '1' definiert ist. Das heißt, es ist immer definiert.
Lars Pensjö
8
#if defined(_DEBUG) || defined(_UNIT_TEST)
  //Code here
#endif

Auch für die Aufzeichnung ist es #elifnicht #elseif.

AshleysBrain
quelle
3
Zu Ihrer Information: Bezeichner / Namen, einschließlich Präprozessorsymbole, beginnend mit einem Unterstrich gefolgt von einem Großbuchstaben (oder beginnend mit zwei Unterstrichen), sind der Implementierung durch die C- und C ++ - Standards vorbehalten. Sie sollten eigentlich nicht in "normalem" Code verwendet werden.
Emmet