variadic-macro相关内容
我尝试获取发送到可变宏的第一个实际参数。这是我试过,它不工作在VS2010: #define FIRST_ARG(N,...)N #define MY_MACRO(...)decltype(FIRST_ARG(__ VA_ARGS__)) 在预处理器输出我看到 FIRST_ARG 返回发送到 MY_MACRO ...的整个参数列表... 另一方面,当我尝试
..
调用一个可变参数宏 M 是否合法,对其可变参数没有参数? 相关标准报价是 [cpp.replace] / 4 : 如果宏定义中的标识符列表不是以省略号结束,调用函数式宏的参数(包括没有预处理令牌的那些参数)的数量应等于宏定义中的参数数量。否则,在调用中将有比宏定义中的参数(不包括 ... )更多的参数。将存在一个终止调用的)预处理令牌。 没有非可变参数的情况下,以 M()形式的调
..
我正在尝试使用C ++ 11 variadac宏。 我试图对列表中的每个参数应用另一个宏。 这是我第一次尝试: #define APPLY_CHAIN(first,...)APPLY_ACT(first)APPLY_CHAIN(__VA_ARGS__) 不幸的是这没有用。 我最终得到了工作。但是它有点复杂,有一个限制'n'(其中'n'是我愿意键入宏的
..
我有一套方法用来建构和初始化一组对象。 除了传递给 Init 函数的参数数量,它们都看起来几乎一样: ObjectType * CreateObjectType(Arg1 a1,Arg2 arg2,... ArgN aN) { ObjectType * object = new ObjectType(); [...] object-> Init(this,a1,a2,...,
..
我有一套方法用来建构和初始化一组对象。 除了传递给 Init 函数的参数数量,它们都看起来几乎一样: ObjectType * CreateObjectType(Arg1 a1,Arg2 arg2,... ArgN aN) { ObjectType * object = new ObjectType(); [...] object-> Init(this,a1,a2,...,
..
典型的LOG()基于宏的日志记录解决方案可能如下所示: #define LOG(msg) \\ std :: cout
..
我有以下宏: #include #define DB_FIELD(...)BOOST_PP_VARIADIC_TO_SEQ(__ VA_ARGS__) #define DB_TOFIELD(type,name)\ private:\ 类型名称## _; \ public:\ const type& get _
..
我想写一个类似于标准 assert 的宏 dbgassert 。除了 assert ,我想要 dbgassert 打印任意数量的附加参数(包含调试信息)。 我到目前为止所列的是从此SO回答。但我有我的问题在我的代码与可变参数模板或宏。如果我使用至少一个附加参数(OK行),则 dbgassert 按预期工作。但是如果我没有额外的参数,那么编译失败(问题行)。 我有一些变化模板编程的经验(
..
我试图使用宏生成函数声明 / *目标:generate int f float b)* / template struct ptype; template struct ptype {typedef P type; }; #define NAMEe #define COMMAe #d
..
对于debugbuilds,我通常使用Clang,因为它更好地格式化警告和错误,并使它更容易跟踪和修复它们。 但是最近在添加一个带有可变参数的宏之后,Clang告诉我以下(从一个虚拟项目): main.cpp:5 :20:warning:named可变参数宏是一个GNU扩展[-Wvariadic-macros] #define stuff3(args ...)stuff_i(ar
..
所以我有一个宏在GCC工作得很好,但不是在微软的C ++编译器。我希望有人可能知道一个解决方法,或者也许可以解释为什么它的行为这种方式。 我确定这个宏并不是“标准”,但它真的会帮助我。 以下是宏的功能示例: #define VA_NARGS_IMPL(_1,_2,_3,_4,_5,N ,...)N #define VA_NARGS(...)VA_NARGS_IMPL(__
..
一个人怎么可以定义一个C宏 IFARGS(YES,NO,...)这样调用 IFARGS 没有额外的参数生成 NO ,并调用 IFARGS 与一个或多个参数产生是? 我在使用GCC(见下文)的答案,但我preFER一为C99,如果可能的(或不可能性的证明)。 解决方案 在C99就可以检测一个宏参数是空的,但要做出这样强大的对抗可能出现在参数中的所有可能性(被自己不断扩大的论点,包含()键,
..
GCC抱怨,如果我这样做: 的#define M(OBJ,满足,......,内容)OBJ ## _ ## MET(常量无效*自我,__VA_ARGS__){\\ 内容\\ } 给予我这些原因有二:错误:宏参数列表中缺少')' 警告:__VA_ARGS__只能出现在C99可变参数宏扩展 显然,C99 - 款式复杂的宏期待右括号省略号后立即,有效地要求一个可变列表是宏的最后一
..
阅读 VA_NARG 我想这取决于 C 使用宏数量的参数来实现函数重载。 现在的问题是: 无效hello1(字符* S){...} 无效hello2(字符* S,字符* T){...} // PP_NARG(...)的参数宏返回号码:裁判上面的链接 //不起作用 你好的#define(...)你好## PP_NARG(__ VA_ARGS__)INT主要(无效) { 你好”); //
..
我知道我能做到这一点: 的#define MACRO(API,...)\\ 布尔RET = API(123,## __ VA_ARGS__); 这仅仅是一个例子,这是一个更复杂的解决方案的一部分。问题的关键是,我需要可变数量的参数追加到第一123。 在##,使编译器带出123参数后面的逗号如果没有参数被传递到宏。 但现在我要追加参数的API,像这样:的#define MACRO(API,
..
我想有一组传递给宏参数变量数目。我有以下宏这是不正确的: 的#define M_NARGS(...)M_NARGS _(__ VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0) #定义M_NARGS _(_ 10,_9,_8,_7,_6,_5,_4,_3,_2,_1,N,...)N的#define M_CONC(A,B)M_CONC_(A,B) 的#define M_CONC_(
..
的#define LOGI(...)((无效)__ android_log_print(ANDROID_LOG_INFO,“原生活动”,__VA_ARGS__)) #定义LOGW(...)((无效)__ android_log_print(ANDROID_LOG_WARN,“原生活动”,__VA_ARGS__)) 这是这2宏定义;后来在code LOGI 和 LOGW 这种方式使用 LOGI
..
如何这工作?如何才能C99 / C ++ 11可变参数的宏来实现扩展到不同的东西有多少参数传递给它的唯一依据? 解决方案 要得到一个重载的宏,首先我们需要哪几个实现之间进行选择的宏。这部分不使用可变参数宏。然后,它一般认为它的参数的可变参数宏产生一个选择。堵漏参数计数到调度员产生过载宏。 警告:本系统无法分辨零和一的论点之间的区别,因为有是的没有任何参数之间以及单个空参数差异。他们都看起
..
有一个众所周知
..