Ich bin auf der Suche nach einem variadic Makro, das einfach eine bestimmte Funktion für jedes Argument (sagen wir bis zu 6) aufruft. Bisher habe ich den folgenden Code in MSVC wurde unter Verwendung von:Portable Variadic Makro
#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__))
Die expand
aufgrund einer besonderen Umgang mit __VA_ARGS__
in MSVC benötigt wird, sonst bekomme ich
error C2660: 'do_write' : function does not take 6 arguments
Aber jetzt muss ich bauen den gleichen Code in GCC, und seine Probleme mit ihm:
error: ‘do_write3’ was not declared in this scope
einfaches Entfernen der expand
Wrapper funktioniert der Trick. Gibt es jedoch eine "richtige" Möglichkeit, den Code in beiden Fällen kompilieren zu lassen, ohne #ifdef
zu verwenden?
Muß * dies * mit Makros geschehen? Kannst du 'C++ 11' verwenden? –
Ich denke, ich könnte es umschreiben, um variadische Vorlagen zu verwenden, der Code ist ziemlich alt, also habe ich nie über diese Möglichkeit nachgedacht. – riv