gpt4 book ai didi

c++ - 使用宏获取函数参数 'name'

转载 作者:太空宇宙 更新时间:2023-11-04 14:40:55 27 4
gpt4 key购买 nike

我已经实现了一个日志功能,最终在所有代码中都以相同的方式使用。

void func(int foo, int bar){
log_api_call("foo", foo, "bar",bar)
...
}

所以我决定让它更简单,只提取变量名。
所以它会像

log_api_call(foo,bar)

甚至更好

log_api_call()

它会以某种方式扩展到 log_api_call("foo", foo, "bar",bar)
我什至不知道从哪里开始“提取”函数变量名。帮助将不胜感激。

编辑:
我知道我之前问的是 C++ 预处理器功能之外的问题,但是 C MACROS 可以将 log_api(a,b) 扩展为 log_api_call("a", a, "b", b) 对于任意数量的参数?对于定义的数字,这项工作是微不足道的。

谢谢。

最佳答案

这其实并不太难。

不过,我还是建议对规范稍作改动;而不是:

expand log_api(a,b) to 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 个参数,但应该很容易看出如何扩展到更多。

关于c++ - 使用宏获取函数参数 'name',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46388105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com