关于_VA_ARGS_宏的有关问题

关于__VA_ARGS__宏的问题
编译环境为VC。想要在可变参数宏中遍历各个参数:


#define ATTR_(attr) printf(attr)
#define ATTR_0(attr, ...)
#define ATTR_1(attr, ...) ATTR_(attr); ATTR_0(__VA_ARGS__)
#define ATTR_2(attr, ...) ATTR_(attr); ATTR_1(__VA_ARGS__)
#define ATTR_3(attr, ...) ATTR_(attr); ATTR_2(__VA_ARGS__)
#define ATTR_4(attr, ...) ATTR_(attr); ATTR_3(__VA_ARGS__)
#define ATTR_5(attr, ...) ATTR_(attr); ATTR_4(__VA_ARGS__)

然后调用:
 
ATTR_3("a","b","c");

会报错:error C2660: 'printf' : function does not take 0 arguments
在预处理器中加上/p可以看到生成的代码如下:
printf("a"); printf("b","c"); printf(); ;

而ATTR_2的调用就不会出错。
另外同样的代码在GCC中貌似可以通过。
请问想要在VC中实现上述功能该怎么办?

------解决方案--------------------
vc不清楚,下面就是gcc的.实际使用过的.
不懂你具体需求,只能猜. 可能需要 ##
#define myprintf(fmt,...) printf(fmt,##__VA_ARGS__)
myprintf("a") => printf("a") 这个##体现
myprintf("%d",i) => printf("%d",i)
宏实现不定参数列表参数个数?
函数的话可以看看 
va_list va_start  va_arg  va_end 这几个.
如果仅仅针对打印的话 man printf  ,下面的可能是你需要的.
 #include <stdarg.h>

       int vprintf(const char *format, va_list ap);
       int vfprintf(FILE *stream, const char *format, va_list ap);
       int vsprintf(char *str, const char *format, va_list ap);
       int vsnprintf(char *str, size_t size, const char *format, va_list ap);
------解决方案--------------------
引用:
这个不影响吧。
刚改过试了下,还是报同样的错。关于_VA_ARGS_宏的有关问题


在VS2012下试了一下,果然如此,g++是没问题的。

把VS的宏替换的过程研究了一下,发现是由于VS出现了非标准问题,本来__VA_ARGS__应被视作多个参数(多于一个实参的情况下),但微软的编译器开发人员把它实现为都视作一个参数了,可以用一个辅助宏ATTR过渡一下,修改后的代码:


#include "stdafx.h"
#include <cstdio>

#define ATTR( attr ) attr
#define ATTR_1( attr ) printf_s( attr )
#define ATTR_2( attr, ... ) ATTR_1( attr ); ATTR( ATTR_1( __VA_ARGS__ ) )
#define ATTR_3( attr, ... ) ATTR_1( attr ); ATTR( ATTR_2( __VA_ARGS__ ) )
#define ATTR_4( attr, ... ) ATTR_1( attr ); ATTR( ATTR_3( __VA_ARGS__ ) )
#define ATTR_5( attr, ... ) ATTR_1( attr ); ATTR( ATTR_4( __VA_ARGS__ ) )
#define ATTR_6( attr, ... ) ATTR_1( attr ); ATTR( ATTR_5( __VA_ARGS__ ) )

int _tmain(int argc, _TCHAR* argv[])
{
ATTR_6( "1", "2", "3", "4", "5", "6" );
return 0;
}