【发布时间】:2015-01-08 09:35:26
【问题描述】:
This question 描述了如何使用__PRETTY_FUNCTION__ 获取函数的全名,包括它的返回类型、参数类型、命名空间和模板参数。
考虑以下漂亮的功能:
namespace foo {
namespace {
template<int i>
int (*bar(int (*arg)(int *)))(int *) {
printf("%s\n", __PRETTY_FUNCTION__);
return arg;
}
} // anonymous namespace
} // namespace foo
如果您不明白,该函数将获取并返回一个指向 int * -> int 函数的指针。
它漂亮的名字是,当使用g++ (4.9) 编译时,
int (* foo::{anonymous}::bar(int (*)(int*)))(int*) [with int i = 1337]
以及,clang++ (3.5),
int (*foo::(anonymous namespace)::bar(int (*)(int *)) [i = 1337])(int *)
这些字符串非常不适合测试函数是否是某个命名空间的一部分。有没有其他方法,或者说,编译器提供的库来解析这些字符串?
为了澄清,我宁愿有类似的东西
foo::{anonymous}::bar <I don't care about anything beyond this point>
更理想的是,我想要一种编译时方式,例如 constexpr 函数 split(__PRETTY_FUNCTION__) 产生某种列表
- 完全限定的函数名
- 返回类型
- arg0 的类型
- arg1 的类型
等等,但我很乐意只使用完全限定的函数名称。
【问题讨论】:
-
听起来你只想要
__FUNCTION__宏? -
__FUNCTION__只会给我bar,这还不够。__func__也是。 -
所以你想要命名空间和名称,而不是返回类型和参数?为什么?
-
这用于项目的日志子系统。我希望能够设置日志记录规则,例如“不记录来自命名空间 foo 或 C 类的 DBG 消息”。实际完全限定的函数名称前面的不确定性混乱使得这不可能。
-
所以你想做
printf(%s\n", modify(__PRETTY_FUNCTION__));之类的事情,而modify()只是一些字符串处理函数?