前段时间移植linux代码到windows的时候发现不支持变长参数的宏,今天搜了一下在http://hack.gameres.com/showthread.asp?threadid=67545找到了解决方法。

To use variadic macros, the ellipsis may be specified as the final formal argument in a macro definition, and the replacement identifier __VA_ARGS__ may be used in the definition to insert the extra arguments. __VA_ARGS__ is replaced by all of the arguments that match the ellipsis, including commas between them.

The C Standard specifies that at least one argument must be passed to the ellipsis, to ensure that the macro does not resolve to an expression with a trailing comma. The Visual C++ implementation will suppress a trailing comma if no arguments are passed to the ellipsis.

Example Copy Code

// variadic_macros.cpp

#include <stdio.h>

#define EMPTY

#define CHECK1(x, …) if (!(x)) { printf(__VA_ARGS__); }

#define CHECK2(x, …) if ((x)) { printf(__VA_ARGS__); }

#define CHECK3(…) { printf(__VA_ARGS__); }

#define MACRO(s, …) printf(s, __VA_ARGS__)

int main()

{

CHECK1(0, “here %s %s %s”, “are”, “some”, “varargs1(1)\n”);

CHECK1(1, “here %s %s %s”, “are”, “some”, “varargs1(2)\n”);// won’t print

CHECK2(0, “here %s %s %s”, “are”, “some”, “varargs2(3)\n”);// won’t print

CHECK2(1, “here %s %s %s”, “are”, “some”, “varargs2(4)\n”); // always invokes printf in the macro

CHECK3(“here %s %s %s”, “are”, “some”, “varargs3(5)\n”);

MACRO(“hello, world\n”);

// MACRO(“error\n”, EMPTY); would cause C2059

}

这个__VA_ARGS__还挺有用,比如,你的宏参数是:vector<T,A>,就麻烦了,因为T与A间有“,”,此时就需要__VA_ARGS__。当然,其使用不可能像变参函数那样灵活。

Advertisements