11

このマクロについて考えてみましょう。

#define MAKE_TEMPLATE(...) template <typename T, __VA_ARGS__ >

引数がゼロの場合、コンパイラはコンマの後に識別子を期待するため、不正なコードが生成されます。実際、VCのプリプロセッサはコンマを削除するのに十分賢いですが、GCCはそうではありません。マクロはオーバーロードできないため、次のように、この特殊なケースで正しく処理するには別のマクロが必要になるようです。

#define MAKE_TEMPLATE_Z() template <typename T>

2番目のマクロを導入せずに動作させる方法はありますか?

4

3 に答える 3

13

いいえ、マクロ呼び出しMAKE_TEMPLATE()にはゼロ引数がまったくないためです。ゼロトークンを含む1つの引数があります。

この回答が最初に書かれた時点で明らかにGCCを含む古いプリプロセッサは、空の引数リストを希望どおりに解釈することがありましたが、コンセンサスは、標準により厳密に準拠する、より厳密で狭い拡張に移行しました。

以下の答えを機能させるには、省略記号の前に追加のマクロパラメータを定義します。

   #define MAKE_TEMPLATE(UNUSED, ...) template <typename T, ## __VA_ARGS__ >

リストが空でない場合は、常に最初の引数の前にコンマを置きます。

   MAKE_TEMPLATE(, foo )

古い答え

http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.htmlによると、GCCはこれをサポートしていますが、透過的ではありません。

構文は次のとおりです。

   #define MAKE_TEMPLATE(...) template <typename T, ## __VA_ARGS__ >

とにかく、どちらもC ++ 0xモードの可変個引数テンプレートをサポートしています。これは、はるかに望ましい方法です。

于 2010-08-25T06:05:20.950 に答える
3

GCCの場合は、次のように記述する必要があります。

#define MAKE_TEMPLATE(...) template <typename T, ##__VA_ARGS__ >

が空の場合__VA_ARGS__、GCCのプリプロセッサは先行するコンマを削除します。

于 2010-08-25T06:07:41.867 に答える
1

まず第一に、可変個引数マクロは現在のC++の一部ではないことに注意してください。次のバージョンになるようです。現時点では、C99でプログラムした場合にのみ準拠しています。

引数がゼロの可変個引数マクロの場合、これを検出してその周りをマクロプログラムするためのトリックがあります。空のマクロ引数のGoogel 。

于 2010-08-25T07:04:38.900 に答える