2011-05-10 97 views
2

Possible Duplicate:
How to get function's name from function's pointer in C?C++:如何将函数指针的名称转换为文本?

我打印配置为程序到命令行每次运行,以及一两件事,我想是打印所使用的当前散列函数 - 存储在一个函数指针变量。

有没有办法做到的线沿线的东西:
std::cout << function_pointer.function_name_to_text() << "\n";

于是想,如果我有一个名为SHA1(字符* pre_image)功能,它只是输出sha1到控制台?整个方法头部也是隆重的。

+0

涉及? http://stackoverflow.com/questions/351134/how-to-get-functions-name-from-functions-pointer-in-c – SubSevn 2011-05-10 18:26:02

+1

你可以创建你自己的函数指针类,它需要函数名。对于'函数对象'或者*函子*来说,这对于调试版本来说是个好主意。 – 2011-05-10 18:53:46

+0

将此问题标记为C类语言的特定问题并将其重复结尾,以防止某人给出C++特定答案。 – alfC 2014-01-24 05:54:36

回答

3

由于函数名称在编译后不存在,所以无法在运行时获取函数名称。

但是,您可以建立一个单独的查询功能,将保存名称,并将其与函数指针相关联:

#include <iostream> 
#include <map> 
#include <string> 
#include <boost/preprocessor/stringize.hpp> 

typedef void (*fptr_t)(char*); 
typedef std::map<fptr_t, std::string> function_map_t; 
function_map_t fmap; 

#define REGISTER_FUNCTION(f) fmap[f] = BOOST_PP_STRINGIZE(f); 

void sha1(char*) {} // a function you want to lookup 

int main() { 
     REGISTER_FUNCTION(sha1) 
     fptr_t my_pointer = sha1; 
     std::cout << "Function name is: " << fmap[my_pointer] << std::endl; 
     return 0; 
} 

编辑:更新编译

+0

我得到了一些错误:SRC/main.h:24:错误:ISO C++禁止没有类型 的src/main.cpp中 'fptr_t' 的声明:在函数 'INT主(INT,常量字符**)': SRC /主。cpp:37:错误:'f'未在此范围内声明 – NullVoxPopuli 2011-05-10 18:56:40

+0

main:37是REGISTER_FUNCTION(func_pointer),其余部分位于头文件中。 = \ – NullVoxPopuli 2011-05-10 18:59:20

+0

上面编辑的版本应该编译。 – vsekhar 2011-05-11 04:01:42

2

在C++语言中没有办法做到这一点,因为它不支持反射。 __FUNCTION__宏是获取当前(指编译器正在编译的)函数名称的非标准方法。它内置在许多平台上,但不是全部。你也许可以用它来接近你想要的东西。

+0

您是否有例子? – NullVoxPopuli 2011-05-10 18:32:56

+0

void foo(int x){printf(“Current function:%s(%d)\ n” ,__FUNCTION__,x);' 将打印出:“当前函数:foo([参数值])” – 2011-05-10 18:36:32

+0

不,我越想越想,如果你需要函数名在你所拥有的只是一个包含函数指针的指针变量的上下文中,链接指令的接受答案中提到的表格方法可能是你最好的选择,我对'__FUNCTION__'的主要用途是用于记录/抛出错误。 – 2011-05-10 18:39:16