13

次のコマンドを使用して

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o  rootTESTOBJECT

コンパイラの警告 root.h:76:22: warning: ISO C does not permit named variadic macros が表示されます

72 #ifdef Debug
73 #include <stdio.h>
74 #define crumb(phrase0...) printf(phrase0)
75 #else
76 #define crumb(phrase0...) 
77 #endif

オプション -ansi -std=c99 を使用すると可変引数マクロを使用できると思いますが、とにかくドキュメントによれば...

76行目を編集してみました

76 #define crumb(phrase0...) printf("")

これで警告が修正されたかどうかを確認しますが、喜びはありません。

コンパイラのバージョンは Apple の gcc、バージョン 4.2.1 です。これについてあまり心配する必要があるかどうかはわかりませんが、私は警告が本当に好きではありません。欠けているフラグは何ですか?

4

1 に答える 1

23

#define crumb(phrase0...) <whatever>phrase0変数引数 ( ) に名前 ( ) を付けています...

これはGCC 拡張機能です。

C99 では、可変引数をマクロに渡す方法を定義しています (§6.10.3/12 および §6.10.3.1/2 を参照)。可変引数は、定義の左側では名前が付けられておらず (つまり、 のみ...)、マクロで参照されます。次のように、右側を次の__VA_ARGS__ようにします。

#define crumb(...) printf(__VA_ARGS__)

(ちなみに、引数にand : のgcc両方を含めないでください。以前の C 標準 (ANSI C、C89、または C90 としてさまざまに知られています) を指定します。この場合、両方のオプションの組み合わせは、引数リストのに表示されるため、たまたま C99 を選択するだけです。 、そして最後のものが勝ちます。)-ansi-std=c99-ansi-std=c99 -ansi

于 2011-07-19T20:00:40.793 に答える