Kompilierdefines
-
hi,
ich habe heute in einer Datei defines der Art
#ifdef DEBUG Breakpoint(); MessageBox(); #else cout << "Error\n"; #endif oder #ifdef WIN32 #include <windows.h> ... #else ... #endifgesehen. Ist mehr Pseudecode also nicht wundern

Jetzt stellt sich mir nur die Frage ob es Makros gibt mit denen man abfragen kann, ob der Compiler im Debug-Modus läuft und ob es eine Win32-Anwendung ist oder ob das einfach in eine config.cpp reingeschrieben wird. Also wenn man eine Win32-Anwendung im Debugmodus kompilieren will folgendes:#define DEBUG #define WIN32
-
Hi !
Kommt auf den Compiler an. Beim Visual C++ kann man das unter
Erstellen/Aktive Konfiguration festlegen/
einstellen.
Bei Kommandozeilen-orientierten Compilern übergibt man da Parameter wie z.B.gcc main.c --debug
Gruß,
p.
-
hm ich glaub ich hab mich etwas undeutlich ausgedrückt. also zunächst mal benutze ich visual c++ express.
und ich hab jetzt folgenden code:
#ifdef DEBUG A(); #else B(); #ifdef WIN32 C(); #else D();er soll also den richtigen code ausführen, abhängig davon ob er im debug modus is/als win32 anwendung läuft. das makro debug kennt er bei mir so nicht, das musste ich also selber setzen. aber wenn ich ein #define WIN32 einfüge erzählt er mir was von redefinition, also das scheint es doch schon zu geben.
kurzum: wie man in den debug/release modus wechselt weiß ich, doch wie bringe ich dem compiler bei welchen code er abhängig davon ausführen muss?
-
Einige Makros (wie __DATE__, STD_C oder auch WIN32) definiert der Compiler schon von sich aus, da mußt du dich nicht drum kümmern. Andere werden je nach Konfiguration als Compiler-Option vordefiniert (z.B. legt der MS-Compiler ein Makro DEBUG an, wenn du dein Projekt im Debug-Build übersetzt).
-
#if defined(...) etc. / #ifdef / #ifndef
tudies
#elif
tudas
#else
oderdas
#endif
-
CStoll schrieb:
Einige Makros (wie __DATE__, STD_C oder auch WIN32) definiert der Compiler schon von sich aus
Das habe ich mir auch gedacht, nur es funktioniert nicht so ganz wie ich mir das vorstelle, weil bei meinem Projekt springt er auch dann in den Codeblock der nach dem #ifdef WIN32 steht wenn es eine Konsolenanwendung ist.
Oder bedeutet das WIN32 nur dass es unter Windows ausgeführt wird?
-
banshee schrieb:
Oder bedeutet das WIN32 nur dass es unter Windows ausgeführt wird?
Ja (genauer: Es kennzeichnet, daß du ein 32-Bit-Windows verwendest)
-
Ich glaube WIN32 ist tatsächlich immer dann definiert wenn der Compiler unter einer Windows(32)-Umgebung läuft. Also auch bei Konsolenprogrammen. Das ist eher dazu nützlich zu entscheiden, ob man jetzt eine Funktion wie getenv() oder doch lieber GetEnvironmentVariable() verwenden sollte.
-
WIN32 _WINDOWS _DEBUGDass DEBUG bei dir nicht geht liegt einfach daran dass es DEBUG (ohne Underscore) beim MSVC nicht gibt. Entweder du verwendest also _DEBUG, oder aber NDEBUG (welches dann definiert ist wenn _DEBUG eben NICHT definiert ist).
-
verwende NDEBUG
heißt soviel wie Nicht-Debug-Modus
-
Hier gibt es eine Übersicht, welche Makros der MSC vordefiniert. In deinem Fall wäre _DEBUG und _WIN32 von Bedeutung.