2016-08-02 7 views
1

Ich möchte einige Debug-Ausgabeanweisungen in eine große C-Code-Basis einfügen. Diese Debug-Ausgabeanweisungen werden von einem Compiler-Optionsschalter gesteuert.Wie schreibe ich ein C-Makro, das zu einem `#ifdef ... # endif'-Makroblock expandiert?

Die Aussage Debug-Ausgabe sieht wie folgt aus:

#ifdef DEBUG_FLAG 
Print(someSymbol) 
#endif 

Tipparbeit zu sparen, ich frage mich, ob es möglich ist, ein einfaches Makro zu definieren, die über die Debug-Ausgabe Anweisungsblock erweitert zu?

Zum Beispiel:

#define DBG_MACRO(someSymbol) (something that can expand to above) 
+0

Dies kann nicht als ersetzte Werte durchgeführt werden, hier ein anderes Makro selbst, wird zum Kompilierzeitfehler führen. – sjsam

+0

[Verwandte] (http://stackoverflow.com/q/2831934/335858) – dasblinkenlight

+1

Wenn Sie einen Makro für Debug-Druck verwenden, dann schauen Sie in [C '# define' Makro für Debug-Druck] (http: // stackoverflow.com/questions/1644868/c-define-macro-for-debug-printing/). Es ist zumindest etwas verlockend, dies als ein Duplikat davon zu schließen. –

Antwort

7

Sie nicht Präprozessordirektiven innerhalb eines Präprozessormakro setzen können.

aber nichts hindert Sie daran, ein Makro zu definieren, die zu nichts erweitert:

#ifdef DEBUG_FLAG 
# define Print(x) Print(x) 
#else 
# define Print(x) 
#endif 

// Expands to an empty statement if DEBUG_FLAG were not set and 
// to a call to Print(something) if DEBUG_FLAG were set. 
Print(something); 

Die oben hängt von Print eine Funktion ist, die bereits deklariert/definiert wurde. Wenn das Makro mit DEBUG_FLAG Satz definiert ist, wird das Makro „ersetzt“ mit sich selbst, aber C-Präprozessor Erweiterungen sind nicht rekursiv, so dass nur die Expansion einmal geschieht, was zu einem Aufruf an Print.

5

Es ist nicht möglich, es so zu tun; Es ist jedoch einfach, ein Makro bedingt zu definieren:

#ifdef DEBUG_FLAG 
    #define DBG_MACRO(arg) Print(arg) 
#else 
    #define DBG_MACRO(arg) 
#endif