- 278 名前:デフォルトの名無しさん mailto:sage [2008/09/23(火) 07:17:40 ]
- C99における可変引数マクロの、##の文字列連結についてお伺いします。
環境はGCCです。 #define a(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, __VA_ARGS__) #define b(fmt, ...) fprintf(stderr, "%s():: " fmt, __func__, ## __VA_ARGS__) a("x=%d", x);と書いたときは、「fmt」が「"x=%d"」、「...」と「__VA_ARGS__」が「x」に対応するので、 fprintf(stderr, "%s()::" "x=%d", __func__, x); と置換されますが、 a("x")と、引数を1つだけしか書かなかった場合には、 fprintf(stderr, "%s()::" "x", __func__, ); とfprintfの引数リストがカンマで終わってしまいコンパイルエラーになります。 そこで、b(fmt, ...)のように##演算子を使うと、問題のカンマが取り除かれるらしいのです。 ##は「パラメータ置換後に、両側の空白文字とともに各##も削除されて、 隣接するトークンが連結され、新しいトークンが形成される」、と K&R第2版で書いてあるのですが、カンマも取り除かれるようになったのでしょうか? それとも、これはGCCで通じる特別なものなのでしょうか? 長くなりましたが、よろしくおねがいします。
|

|