2017-05-04 3 views
0

Ich habe einen Code, der #warning viel verwendet, um Kompilierungszeit Zweige an den Benutzer zu signalisieren. Der Code hat viele Konfigurationsoptionen, daher ist nicht wirklich klar, welche Bits des Codes tatsächlich in die Kompilierung übernommen werden.Bedingte Verwendung #warning oder #pragma Nachricht oder nichts

Sobald Sie die Konfigurationsoptionen ausgewählt haben, verwirren diese Warnungen die Ausgabe wirklich. Daher möchte ich sie deaktivieren können. Der einfachste Weg wäre, jede dieser Warnungen in ein #ifdef ... #else Konstrukt zu verpacken. Aber wenn ich diesen Code noch einmal anfassen sollte, muss ich die gesamte Codebasis erneut durchlaufen.

Also stattdessen möchte ich dies ein wenig abstrahieren. Ich stecke jedoch fest, ein Makro zu definieren, das #warning oder #pragma message aufruft. Die folgenden kompiliert aber nicht tun, das Richtige:

#ifdef EMIT_WARNINGS 
#define WARNING(s) _Pragma("message(\"Hi\")") 
#else 
#define WARNING(s) 
#endif 

WARNING("How can I print this?") 

Alle meine Versuche des Setzens s in dort gescheitert. Sobald ich _Pragma("message(\"" s "\")") mache, bekomme ich, dass _Pragma einen einzelnen geklammerten String erwartet.

Gibt es etwas, was ich tun kann, um dies schön zu abstrahieren?

Antwort

0

Von https://gcc.gnu.org/onlinedocs/gcc-6.3.0/cpp/Diagnostics.html#Diagnostics

Weder ‚#error‘ noch ‚#WARNING‘ Makro erweitert sein Argument. Interne Leerraumsequenzen werden jeweils durch einen einzelnen Raum ersetzt. Die Linie muss aus vollständigen Token bestehen. Es ist am klügsten, wenn das Argument dieser Direktiven eine einzige String-Konstante ist; dies vermeidet Probleme mit Apostrophen und dergleichen.

0
Alle meine Versuche, s dorthin zu bringen, sind gescheitert. Sobald ich _Pragma ("message (\" s "\") ") mache, bekomme ich, dass _Pragma einen einzelnen geklammerten String erwartet.

_Pragma(S) gleiche Wirkung #pragma X hat, wobei X die unstringified Form von S. rückwärts ist, dass das bedeutet, dass die Wirkung von #pragma X in einem _Pragma Anruf zu bekommen, müssen Sie einfach stringify X.

Die Tatsache, dass ein Teil von X selbst eine Zeichenkette ist, führt Sie in die Irre ... denken Sie nicht an diese Teile, die Sie zusammenbauen, sondern eher an ein Ganzes. Anstatt zu versuchen, s und legte es in "message(\"" und "\")" stringify, stringify nur message(s) selbst als Ganzes, wie folgt aus:

#ifdef EMIT_WARNINGS 
#define WARNING_I(s) _Pragma(#s) 
#define WARNING(s) WARNING_I(message(s)) 
#else 
#define WARNING(s) 
#endif 
WARNING("How can I print this?") 

Also, wenn Warnungen aktiviert sind, erweitert WARNING("How can I print this?") zu WARNING_I(message("How can I print this")). Dieses Argument zu WARNING_I ist selbst, was Sie auf eine Pragma-Linie setzen würden; es ist deine X. Die Definition von WARNING_I dann stringifiziert, dass die richtige S für _Pragma.

Verwandte Themen