这其实不是太难。
我建议在规范中的一个微小变化,虽然;而不是:
扩大
log_api(a,b)
到
log_api_call("a", a, "b", b)
...它更有助于扩大类似NAMED_VALUES(a,b)
到"a",a,"b",b
。然后你可以调用log_api(NAMED_VALUES(a,b))
,但是你的log_api可以保持更通用(例如,log_api(NAMED_VALUES(a,b),"entering function")
是可能的)。这种方法还可以避免关于零参数案件的很多复杂问题。
// A preprocessor argument counter
#define COUNT(...) COUNT_I(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1,)
#define COUNT_I(_9,_8,_7,_6,_5,_4,_3,_2,_1,X,...) X
// Preprocessor paster
#define GLUE(A,B) GLUE_I(A,B)
#define GLUE_I(A,B) A##B
// chained caller
#define NAMED_VALUES(...) GLUE(NAMED_VALUES_,COUNT(__VA_ARGS__))(__VA_ARGS__)
// chain
#define NAMED_VALUES_1(a) #a,a
#define NAMED_VALUES_2(a,...) #a,a,NAMED_VALUES_1(__VA_ARGS__)
#define NAMED_VALUES_3(a,...) #a,a,NAMED_VALUES_2(__VA_ARGS__)
#define NAMED_VALUES_4(a,...) #a,a,NAMED_VALUES_3(__VA_ARGS__)
#define NAMED_VALUES_5(a,...) #a,a,NAMED_VALUES_4(__VA_ARGS__)
#define NAMED_VALUES_6(a,...) #a,a,NAMED_VALUES_5(__VA_ARGS__)
#define NAMED_VALUES_7(a,...) #a,a,NAMED_VALUES_6(__VA_ARGS__)
#define NAMED_VALUES_8(a,...) #a,a,NAMED_VALUES_7(__VA_ARGS__)
#define NAMED_VALUES_9(a,...) #a,a,NAMED_VALUES_8(__VA_ARGS__)
这最多支持9个参数,但应该很容易看到如何扩展到更多。
为什么不宏能做到这一点?我的意思是,当然不是任何数字,但是对于合理的数字(例如少于20),您可以使用@ Hwalter的解决方案或类似的东西。 – MikeMB
实际上,你的确将参数限制于例如20,也许你可以找到一些[boost](http://boost.org/)库来做这件事 –