【发布时间】:2016-07-04 12:34:42
【问题描述】:
我正在寻找一个可变参数宏,它只为每个参数(例如,最多 6 个)调用某个函数。到目前为止,我一直在 MSVC 中使用以下代码:
#define do_write2(x,y) do{do_write(x);do_write(y);}while(0)
#define do_write3(x,y,z) do{do_write(x);do_write(y);do_write(z);}while(0)
#define do_write4(x,y,z,w) do{do_write(x);do_write(y);do_write(z);do_write(w);}while(0)
#define do_write5(x,y,z,w,t) do{do_write(x);do_write(y);do_write(z);do_write(w);do_write(t);}while(0)
#define do_write6(x,y,z,w,t,u) do{do_write(x);do_write(y);do_write(z);do_write(w);do_write(t);do_write(u);}while(0)
#define expand(x) x
#define _get_write(_1,_2,_3,_4,_5,_6,name,...) name
#define dumpval(...) expand(_get_write(__VA_ARGS__,do_write6,do_write5,do_write4,do_write3,do_write2,do_write))expand((__VA_ARGS__))
由于在 MSVC 中对 __VA_ARGS__ 的特殊处理,需要 expand,否则我会得到
error C2660: 'do_write' : function does not take 6 arguments
但是,现在我需要在 GCC 中构建相同的代码,并且遇到了问题:
error: ‘do_write3’ was not declared in this scope
只需删除 expand 包装器就可以了。但是,是否有任何“正确”的方法可以在不使用#ifdef 的情况下在这两种情况下编译代码?
【问题讨论】:
-
这必须使用宏来完成吗?可以用
C++11吗? -
我想我可以重写它以使用可变参数模板,代码很旧所以我从来没有考虑过这种可能性。
标签: c++ visual-studio gcc c-preprocessor variadic-macros