2016-06-16 12 views
1

VS2013でこれを実行しようとしています(Variadic macro trickおよびC++ preprocessor __VA_ARGS__ number of argumentsを参照)。C++:Visual Studioで各可変引数を処理する

これはafaikのコピーではありません(他のバージョンはGCCでのみ動作します)。

何が問題なのですか?私は...ほとんどそこだ

#define _EXPAND(x) x 
#define _VA_NARGS_IMPL(_1_, _2_, _3_, _4_, _5_, N, ...) N 
#define _VA_NARGS_IMPL2(...) _EXPAND(_VA_NARGS_IMPL(__VA_ARGS__, 4, 3, 2, 1, 0)) 
#define _PUSH_X_FRONT(...) X, __VA_ARGS__ 
/* 
Returns the number of arguments specified. 
#ifndef _MSC_VER 
    #define VA_NARGS(...) _VA_NARGS_IMPL2(X,##__VA_ARGS__) 
*/ 
#define VA_NARGS(...) _VA_NARGS_IMPL2(_PUSH_X_FRONT(__VA_ARGS__)) 

// testing is gewd 
static_assert(VA_NARGS() == 0, "VA_NARGS() failed for 0 arguments"); 
static_assert(VA_NARGS(one, two, three, four) == 4, "VA_NARGS() failed for 4 arguments"); 

#define _VARARG_IMPL2(N, Macro, ...) Macro##N(__VA_ARGS__) 
#define _VARARG_IMPL(N, Macro, ...) _VARARG_IMPL2(N, Macro, __VA_ARGS__) 
// Helper function for variadic macros with per-argument processing. 
#define VARARG(Macro, ...) _VARARG_IMPL(VA_NARGS(__VA_ARGS__), Macro, __VA_ARGS__) 


#define _Quote1(x) #x 
#define _Quote2(x, ...) #x, _Quote1(__VA_ARGS__) 
#define _Quote3(x, ...) #x, _Quote2(__VA_ARGS__) 
#define _Quote4(x, ...) #x, _Quote3(__VA_ARGS__) 
// Treat each argument as a string literal, encompassing in quotes. 
#define Quote(...) VARARG(_Quote, __VA_ARGS__) 

質問:

constexpr char *a[] = { Quote(a, b) }; 
// WHY does the above produce {"a, b"} with msvc? 
// The following produces {"a", "b"} as expected 
constexpr char *a[] = { _Quote2(s, c) }; 

答えて

0

VS2013で動作するように本当の可変引数マクロを作成することは困難です。新しいマクロとして自分自身で解釈されるようにマクロを拡張するために何かをしました。キーは複数レベルのマクロを作ることです。コードにはたくさんありますが、与えられたサンプルではうまくいきます。

#define InitialMacro (argument1, argument2) \ 
DetailedMacro(argument1, argument2, argument1##_description, argument2##_description) 

#define DetailedMacro (argument1, argument2, argument3, argument4)  \ 
L#argument1  \ 
L#argument2  \ 
L#argument3  \ 
L#argument4 

ここで提示されているideeaは、必要なすべてのパラメータをnedeedで満たすのに十分なマクロを実装することです。また、途中で追加項目でマクロを転送/更新することもできます。 基本的に、この例の最初のマクロは、2番目と3番目に送信されたパラメータに_descriptionの接尾辞を追加し、マクロとして解釈される別のマクロを作成し、DetailedMacroで展開します。

msvc variadic macro expansion

関連する問題