在C ++中,有没有办法从它的指针中获取函数签名/名称?
void test(float data) {}
cout << typeid(&test).name();
我想将此数据用于记录。
答案 0 :(得分:19)
选项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
答案 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 ++。