You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何通过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

火山引擎 最新活动