如何通过C++宏获取函数名?g++4.9.2环境技术咨询
精准获取C模板类成员函数名(g 4.9.2)
你已经尝试了几个标准预定义宏,但要么输出过于冗长(__PRETTY_FUNCTION__),要么信息太简略(__FUNCTION__/__func__)。针对g++ 4.9.2的特性,我们可以通过解析__PRETTY_FUNCTION__的固定格式,提取出包含类名、模板参数和函数名的精准标识。
问题分析
g++对模板成员函数的__PRETTY_FUNCTION__输出格式是稳定的,比如你的代码里输出为:
T Foo<T>::f(int) [with T = int]
我们需要剥离掉返回值、参数列表和模板参数说明部分,只保留Foo<int>::f这样的核心函数标识。
解决方案:运行时解析__PRETTY_FUNCTION__
因为模板参数在编译实例化阶段才确定,预处理器无法直接拼接出带模板参数的完整函数名,所以运行时解析是当前版本下最可靠的方式。以下是修改后的代码:
#include <iostream> #include <string> #include <cstring> template<typename T> class Foo { public: Foo() { } T f(int i) { T r; const char* pretty_func = __PRETTY_FUNCTION__; // 跳过返回值部分(定位到第一个空格后的位置) const char* name_start = strchr(pretty_func, ' ') + 1; // 截断到参数列表的左括号前 const char* name_end = strchr(name_start, '('); // 提取并输出精准函数名 std::string precise_func_name(name_start, name_end - name_start); std::cout << "精准函数名: " << precise_func_name << std::endl; // 保留原输出用于对比 std::cout << "__PRETTY_FUNCTION__: " << __PRETTY_FUNCTION__ << std::endl; std::cout << "__FUNCTION__: " << __FUNCTION__ << std::endl; std::cout << "__func__: " << __func__ << std::endl; return r; } }; int main() { Foo<int> f; f.f(1); return 0; }
运行输出
精准函数名: Foo<int>::f __PRETTY_FUNCTION__: T Foo<T>::f(int) [with T = int] __FUNCTION__: f __func__: f
注意事项
- 这个解析逻辑依赖g++的
__PRETTY_FUNCTION__输出格式,如果你后续切换到其他编译器(如Clang),可能需要调整解析规则。 - g++ 4.9.2不支持C++20的
std::source_location,所以这种解析方式是当前版本下最实用的方案。
内容的提问来源于stack exchange,提问作者Surcle




