次のように呼び出されるマクロが必要です。
GCC_WARNING(-Wuninitialized)
これは、次のようなコードに展開されます。
_Pragma("GCC diagnostic ignored \"-Wuninitialized\"")
プリプロセッサの結合と文字列化の通常のトリックが適用されないように見えるか、ここでそれらを適用する方法がわからないため、これを機能させることができません。
プリプロセッサ マジックの助けを借りて:
#define HELPER0(x) #x
#define HELPER1(x) HELPER0(GCC diagnostic ignored x)
#define HELPER2(y) HELPER1(#y)
#define GCC_WARNING(x) _Pragma(HELPER2(x))
GCC_WARNING(-Wuninitialized)
マクロの引数を一重引用符で囲んでもよいでしょうか? もしそうなら、あなたはこれを使うことができます:
#define GCC_WARNING(x) _Pragma("GCC diagnostic ignored '" #x "'")
GCC_WARNING(-Wuninitialized)
に展開するように呼び出すと、
_Pragma("GCC diagnostic ignored '" "-Wuninitialized" "'")
ここでは C の文字列連結動作 ( printf("a" "b");
is the same as printf("ab");
) を使用する必要がありました。これは"'#x'"
、マクロで使用するx
と展開が回避されるためです。