DsC*_*Cpp 0 c++ macros function
我已经实现了一个日志函数,最终在整个代码中都以相同的方式使用。
void func(int foo, int bar){
log_api_call("foo", foo, "bar",bar)
...
}
Run Code Online (Sandbox Code Playgroud)
所以我决定让它变得更简单,只提取变量名称。
所以会是这样的
log_api_call(foo,bar)
Run Code Online (Sandbox Code Playgroud)
甚至更好
log_api_call()
Run Code Online (Sandbox Code Playgroud)
它会以log_api_call("foo", foo, "bar",bar)某种方式扩展。
我什至不知道从哪里开始“提取”函数变量名称。非常感谢您的帮助。
编辑:
我知道我之前问的问题超出了 C++ 预处理器功能的范围,但是 C MACROS 可以扩展log_api(a,b)到log_api_call("a", a, "b", b) 任意数量的参数吗?对于定义的数字来说,这项工作是微不足道的。
谢谢。
这其实并不太难。
不过,我建议稍微改变一下规格;代替:
扩展log_api(a,b)到log_api_call("a", a, "b", b)
NAMED_VALUES(a,b)...扩展类似to更有用"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__)
Run Code Online (Sandbox Code Playgroud)
它最多支持 9 个参数,但应该很容易看出如何扩展到更多。