2017-02-16 3 views
0

In meiner C++ .h Datei gelesen werden:C++ #define Wert nicht in CPP-Datei

class foo { 
#define useThis true 

... 
} 

In meiner .cpp Datei:

#if useThis 
... generate A code 
#else 
... generate B code 
#endif 

Das Problem ist, dass die #define Werte werden nicht eingelesen die .cpp Datei, so was passiert ist, wird sowohl A und B generiert werden.

Ich schließe die .h Datei in der Oberseite der .cpp Datei ein.

+1

Erstens veröffentlichen echter Code mehr geht hier um zu helfen . Es gibt keine Möglichkeit, dass ein richtiger Compiler beide generiert (in diesem Fall wird 'generate B code' der gewinnende Zweig sein). Zweitens, verwende "1" anstelle von "wahr", da "wahr" kein Präprozessorwert ist. Das, oder benutze einfach '#ifdef useThis' oder' #if defined (useThis) 'und lasse den' true' Wert komplett weg. – Qix

+1

[Kann nicht reproduziert werden.] (Http://melpon.org/wandbox/permlink/iVXMEjUZLFjJeMSZ) – chris

+1

@Qix Der C++ - Präprozessor ** erkennt ** 'true' und' false' als die entsprechenden booleschen Werte. – Angew

Antwort

0

Boolescher Wert kann nicht in Makros für einige Compiler wie Visual Studio (funktioniert unter g ++ obwohl) verwendet werden. Eine Cross-Compiler Art und Weise sollte sein:

#define useThis 1 

Oder ein Makro ohne Wert definieren und verwendet ifdef zu testen, ob es definiert wurde:

#define useThis 

#ifdef useThis 
    ... 
#else 
    ... 
#endif 
+0

Ich bin in einer jetzt gelöschten Antwort darüber gegangen, aber [das ist falsch] (http://eel.is/c++draft/cpp.cond). * Nachdem alle Ersetzungen aufgrund von Makroexpansion und Auswertungen von definierten Makroausdrücken und Has-Include-Ausdrücken durchgeführt wurden, werden alle verbleibenden Identifizierer und Schlüsselwörter, außer für wahr und falsch, durch die pp-Nummer 0 und dann jede ersetzt Vorverarbeitungstoken wird in ein Token umgewandelt. * und * Die resultierenden Token umfassen den kontrollierenden Konstantenausdruck, der nach den Regeln von [expr.const] ausgewertet wird ... * – chris

+0

Kurz gesagt, 'true' wird nicht wie andere Bezeichner durch 0 ersetzt . Nach diesem Schritt wird der Ausdruck "wahr" nach den gleichen Regeln wie die Bewertung von konstanten Ausdrücken überall in der Sprache ausgewertet, wobei die Bedingung "# if" erfüllt wird. – chris

+0

@chris Scheint, es ist ein Compiler-ähnliches Verhalten. Boolesch im Makro funktioniert nicht für Visual Studio 2013, funktioniert aber für g ++. –