11得票3回答
带零参数和逗号的可变宏

考虑这个宏: #define MAKE_TEMPLATE(...) template <typename T, __VA_ARGS__ > 当使用零个参数时,它会产生糟糕的代码,因为编译器期望在逗号后面有一个标识符。实际上,VC的预处理器足够聪明,可以删除逗号,但GCC的预处...

11得票1回答
C++预处理器在调用可变参数宏时会移除空格(Solaris Studio 12.3)

Oracle Solaris Studio 12.3的C++预处理器在扩展__VA_ARGS__时完全移除空格。 有人能否确认他们系统上的这种行为?这是已知的编译器错误吗?是否有任何解决此问题的方法? 以下是一个简单的测试程序vaargs.c,以说明该问题:#include <std...

12得票3回答
使用__VA_ARGS__定义字符串化宏时出现错误

我一直在尝试在C语言中实现一个函数宏,它将"DEBUG: "添加到参数前,并将其参数传递给printf:#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__) 使用gcc时出现了以下错误:src/include/...

8得票2回答
变长参数函数调用变长宏

我有一个内联变参函数:inline int foo(...) 我需要让foo()调用一个宏(假设叫做MACRO),这个宏也是变参的。基本上,我需要让foo()将其所有输入参数传递给MACRO。 重新定义foo()作为另一个宏是一种简单的解决方法,因为有__VA_ARGS__选项,但是我还需要f...

14得票1回答
无参数的可变宏及其可变参数

如果一个可变参数宏M的参数列表不以省略号结尾,那么在调用这个类函数宏时,传递给它的实参(包括那些由零个预处理记号组成的实参)的个数必须等于该宏在定义时所指定的形参的个数。否则,在调用该类函数宏时,必须传递更多的实参比该宏在定义时所指定的形参的个数多1(不包括...)。调用必须以右括号)结束。 ...

12得票2回答
C预处理器将"int x"拆分为int和x。

我需要能够获取以下内容:#define MY_MACRO(PARAM1,PARAM2) \ MY_OTHER_MACRO(TYPENAME_OF(PARAM1),PARAMNAME_OF(PARAM1));\ MY_OTHER_MACRO(TYPENAME_OF(PARAM2),PARAM...

16得票9回答
在Visual C++中是否有一种方法可以编写具有可变参数列表的宏?

据我所知,在 gcc 中你可以这样写: As far as I know, in gcc you can write something like:#define DBGPRINT(fmt...) printf(fmt); 在VC++中有没有一种方法可以做到这一点?

130得票12回答
C++预处理器__VA_ARGS__参数数量

我在网络上找不到答案的一个简单问题。在可变参数宏中,如何查找参数的数量?如果使用boost预处理器有解决方案,那就没问题了。 如果这有所区别,我正在尝试将不定数目的宏参数转换为boost预处理器序列、列表或数组进行进一步处理。

9得票2回答
可变参数宏和尾随逗号

我正在尝试在C语言中进行面向对象编程,并希望有一个语法糖宏来表示这种方法。 object->vtable->method(object, arg1, arg2) 转化为 send(object, method, arg1, arg2) 很不幸,当一个方法不需要参数时,就...

71得票3回答
MSVC不能正确扩展__VA_ARGS__。

考虑以下代码:#define F(x, ...) X = x and VA_ARGS = __VA_ARGS__ #define G(...) F(__VA_ARGS__) F(1, 2, 3) G(1, 2, 3) 期望输出对于两个宏都是X = 1 and VA_ARGS = 2, 3,我使...