Präprozessordirektive in Makro
-
Hallo,
ich möchte diese Präprozessordirektive in ein Makro packen. Mit einem einfachen #define geht es aber leider nicht. Kann mir da einer weiterhelfen.#if defined( DEBUG ) || defined( _DEBUG )) // | | | | | | | | // vvvv geht leider nicht vvvv #define (START_DEBUG) (#if defined( DEBUG ) || defined( _DEBUG )))
-
Expandierte Makros werden vom Präprozessor nicht noch einmal ausgewertet. Beschreib mal in Worten, was du erreichen möchtest.
-
So:
#if defined( DEBUG ) || defined( _DEBUG )) #define DEBUG_CODE(code) do { code } while(0) #else #define DEBUG_CODE(code) ((void)0) #endif //und dann: int divide(int a, int b) { DEBUG_CODE(( if(b==0) cout<<"WTF? pass besser auf!\n"; )); return a/b; }
-
Shade Of Mine schrieb:
So:
#if defined( DEBUG ) || defined( _DEBUG )) #define DEBUG_CODE(code) do { code } while(0) #else #define DEBUG_CODE(code) ((void)0) #endif //und dann: int divide(int a, int b) { DEBUG_CODE(( if(b==0) cout<<"WTF? pass besser auf!\n"; )); return a/b; }Kann ich nicht nachvollziehen.
-
Ich auch nicht. Aber so sollte es gehen:
int divide(int a, int b) { DEBUG_CODE({ if(b==0) cout<<"WTF? pass besser auf!\n"; }); return a/b; }Bzw. so lange wie in diesem Beispiel kein Komma im Code vorkommt, sogar so:
int divide(int a, int b) { DEBUG_CODE( if(b==0) cout<<"WTF? pass besser auf!\n"; ); return a/b; }Man könnte es natürlich auch gleich so machen:
#if defined( DEBUG ) || defined( _DEBUG )) #define MY_DEBUG #endif int divide(int a, int b) { #ifdef MY_DEBUG if(b==0) cout<<"WTF? pass besser auf!\n"; #endif return a/b; }
-
volkard schrieb:
Kann ich nicht nachvollziehen.
In der Tat, ich dachte echt dass das so geht. Irgendwas derartiges hatte ich mal. Muss ich mal suchen was damals der Trick war dass das so in der Art geht.

PS:
Habe es damals mit BEGIN_* und END_* makros gemacht.
Komische hatte das irgendwie so in erinnerung - aber die Kommas killen einen dann.
-
Ich hatte ne Zeit lang sowas
#if defined( DEBUG ) || defined( _DEBUG ) #define IF_DEBUG if(false);else #else #define IF_DEBUG if(true); else #endif //und dann: int divide(int a, int b) { IF_DEBUG if(b==0) cout<<"WTF? pass besser auf!\n"; return a/b; }Nach IF_* steht genau eine Anweisung, die davon betroffen ist.
-
Spricht etwas dagegen, bei Komma-Problemen einfach folgenden Code zu verwenden?
#if defined( DEBUG ) || defined( _DEBUG )) #define DEBUG_CODE(...) do { __VA_ARGS__ } while(0) #else #define DEBUG_CODE(...) ((void)0) #endifÜbrigens hatte ich dieses Problem auch mal bei einer std::map<Typ1, Typ2> als Parameter - sehr unerwartetes Verhalten.