C ++,获取函数的名称

时间:2010-06-20 10:09:54

标签: c++ string function

在C ++中,有没有办法从它的指针中获取函数签名/名称?

void test(float data) {}
cout << typeid(&test).name();

我想将此数据用于记录。

5 个答案:

答案 0 :(得分:19)

C ++,通过指针获取调用函数的名称:

选项1:滚动您自己的功能名称记录器

如果要将“指向函数的指针”解析为“函数名”,则需要创建自己的所有可用函数的查找表,然后将指针地址与查找表中的键进行比较,返回名字。

此处描述的实施:https://stackoverflow.com/a/8752173/445131

选项2:使用__func__

GCC提供这个魔术变量,它以字符串形式保存当前函数的名称。它是C99标准的一部分:

#include <iostream>
using namespace std;
void foobar_function(){
    cout << "the name of this function is: " << __func__ << endl;
}
int main(int argc, char** argv) {
    cout << "the name of this function is: " << __func__ << endl;
    foobar_function();
    return 0;
}

输出:

the name of this function is: main
the name of this function is: foobar_function

备注:

__FUNCTION____func__的另一个名称。较旧版本的GCC仅识别此名称。但是,它没有标准化。如果需要最大可移植性,我们建议您使用__func__,但使用预处理器提供回退定义,以便在未定义时定义它:

 #if __STDC_VERSION__ < 199901L
 # if __GNUC__ >= 2
 #  define __func__ __FUNCTION__
 # else
 #  define __func__ "<unknown>"
 # endif
 #endif

来源:http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

答案 1 :(得分:15)

如果你只想记录当前的函数名,大多数编译器都有__FUNCTION__宏,这将在编译时为你提供当前的函数名。

您也可以查找堆栈遍历技术(此处为an example for Windows),它可以在运行时为您提供有关当前调用堆栈和函数名称的更多信息。

答案 2 :(得分:3)

你无法获得该功能的名称。仅仅因为它不在可执行文件中。编译代码后,它会完全消失。联的。

您可以尝试重命名您的函数/变量,并且您的可执行文件将是相同的(除了编译器可能提供的可变内容,例如构建日期/时间,调试信息ID等)。

还尝试使用某个编辑器打开可执行文件并查找函数名称。很可能你找不到它。

但是,您可以使用一些程序化的“装饰”来帮助您在运行时发现您的函数名称。

答案 3 :(得分:1)

您无法在C ++中获取该函数的名称,但您可以打印指针,然后检查函数名称的二进制文件(如果未剥离)。签名可以完全按照您的方式打印,只是类型名称不是真正“人类可读”。检查编译器文档,了解代码输出的含义。在g ++中,输出将是PFvfE,我完全不理解,但是指向函数(P)的指针(F)返回void(v)并将浮点数(f)作为单个参数。不要问我E是什么......

(我现在没有时间查看文档,我只是用一个示例程序来猜测:打印不同的函数签名)

答案 4 :(得分:0)

我不是百分百肯定,但在我看来,这似乎是反射(Java),而C ++不支持这样的事情。可能我只是不知道,但我还没有看到这个用于C ++。