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?

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 

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" ).


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.


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