C :处理Visual Studio中的每个变异参数
C++: Process each variadic argument in Visual Studio
试图在VS2013中使用此功能(请参阅Variadic Macro Trick和C Preprocessor __VA_ARGS_________________________________________________________________________________
这不是重复的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) };
很难在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的所有要求。另外,您可以在途中使用Aditional项目转发/更新宏。基本上是该示例中的第一个宏附加于第二和第三个传输参数。后缀_description导致另一个宏将被解释为宏,并将在详细的macro中扩展。
。您还可以看一下:MSVC variadic宏扩展
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 具有变异模板模板参数的方法的部分专业化
- 我如何实现变异模式以将可变数量的参数转发到C 11中的函数
- 组合类模板默认参数和变异参数
- 继承具有变异参数的构造函数
- C 参数包作为变异模板
- 在没有参数的变异模板中迭代
- 结构化参数为变异模板
- C 是否允许在变异模板参数之后进行普通参数
- 计数宏函数中变异参数的数量
- 如何使模板通过变异参数推断返回类型的函数
- 为什么C 不允许在非模板函数中进行变异参数
- C :处理Visual Studio中的每个变异参数
- 为什么这个嵌套的变异模板是无效的参数
- 如何绑定变异模板参数与功能