6

次のように呼び出されるマクロが必要です。

GCC_WARNING(-Wuninitialized)

これは、次のようなコードに展開されます。

_Pragma("GCC diagnostic ignored \"-Wuninitialized\"")

プリプロセッサの結合と文字列化の通常のトリックが適用されないように見えるか、ここでそれらを適用する方法がわからないため、これを機能させることができません。

4

2 に答える 2

15

プリプロセッサ マジックの助けを借りて:

#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)
于 2012-01-04T09:55:50.317 に答える
0

マクロの引数を一重引用符で囲んでもよいでしょうか? もしそうなら、あなたはこれを使うことができます:

#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と展開が回避されるためです。

于 2012-01-04T09:53:18.857 に答える