3

最近、私は SO をブラウズしていて、サム・ヤンセンがマクロを宣言しているこのトピックに出くわしましPACKED_STRUCT(name)たが、コードでは、引数なしで 1 回、名前引数を指定して 1 回使用しています。

同様のサンプル プログラムを GCC 4.6.1 でコンパイルしようとしましたが、警告がまったく表示されずに正常にコンパイルされたことに驚きました (-std=c99 -Wall -Wextra -pedanticコマンド ライン スイッチを使用していました)。しかし、2引数のマクロを作って2引数以下で呼ぼうとするとうまくいきませんでした。

だから私の質問は、これがGCCのバグなのか、それともGCCの機能なのか、それとも標準のどこかで定義されているのか、このように動作しなければならないのか?

GCC のドキュメントのこのページによると、これは不可能です。

4

1 に答える 1

3

GCC のドキュメントのそのページをもう一度読んでください。空の引数と欠落した引数を区別しています。与えられた

#define ONE(x)    one(x)
#define TWO(x,y)  two(x,y)

プリプロセッサに関する限り、これらはすべて完全に問題ありません(コメントの拡張):

ONE(1)    /* one(1)   */
ONE()     /* one()    */
TWO(1,2)  /* two(1,2) */
TWO(1,)   /* two(1,)  */
TWO(,2)   /* two(,2)  */
TWO(,)    /* two(,)   */

しかし、これは問題ありません:

TWO()     /* error: macro "TWO" requires 2 arguments, but only 1 given */
于 2012-09-30T12:41:36.730 に答える