0
現在、私は私が書いていない、次のマクロを使用するVisual Studioの2015のService Pack 2でいくつかのコードをコンパイルしようとしている:Visual Studioの可変引数マクロ展開利回り予想外の結果
#define REM(...) __VA_ARGS__
#define EAT(...)
// Retrieve the type
#define TYPEOF(x) DETAIL_TYPEOF(DETAIL_TYPEOF_PROBE x,)
#define DETAIL_TYPEOF(...) DETAIL_TYPEOF_HEAD(__VA_ARGS__)
#define DETAIL_TYPEOF_HEAD(x , ...) REM x
#define DETAIL_TYPEOF_PROBE(...) (__VA_ARGS__),
// Strip off the type
#define STRIP(x) EAT x
// Show the type without parenthesis
#define PAIR(x) REM x
たぶんTYPEOFマクロを式の型を分離します。 私は、次の呼び出しでTYPEOFマクロを呼び出すために試してみました:理論的には
TYPEOF((int) m) c;
、結果は
int型のCでなければなりません。
代わりにプリプロセッサ出力
int、m、c;
#define DETAIL_TYPEOF_HEAD(x , ...) X = x and VA_ARGS = __VA_ARGS__
と
#define DETAIL_TYPEOF_HEAD(x, ...) REM x
を交換
この出力が得られる:
X =(INT)、M、及びVA_ARGS = Cを、
DETAIL_TYPEOF_HEADマクロを入力すると、variadicパラメータリストから最初のエントリxを選択することができず、その代わりにリスト全体がxになります。
あなたはこの現象を知っていますか?
よろしく
私はこれまでにこの現象に遭遇したと思います。 * Microsoftコンパイラ*と呼ばれています。 –
@ n.m。私は通常建設的ではないとフラグを立てるだろうが、この場合はおそらく正しいだろう。 http://stackoverflow.com/questions/9183993/msvc-variadic-macro-expansion – lcs
@lcsよく私は少し冗談コメントをここに残すことが大好きですが、私は利用可能なすべての主要なコンパイラと標準のテキスト。 –