如何获取函数的地址?

时间:2016-12-21 13:42:08

标签: c++ function pointers

函数的地址是带括号的名称。但是,当我使用cout打印出地址时,这是错误的。

假设函数是" int function_address()"和代码如b

cout<<function_address<<endl;

1 个答案:

答案 0 :(得分:2)

  

函数的地址是带括号

的名称

函数的地址其名称。它是一个存储器地址,例如0x0000000000020d57(在Linux上,您可以使用nm获取全局函数的地址)在运行程序的进程的virtual address space中。 函数名称在运行时被遗忘(与dynamic linking相关时除外,并且该概念不在标准C ++中,但与实现相关)。您甚至可以strip可执行文件的符号表。函数名仅在编译时和链接时有用。

通常,您无法从其地址获取函数名称。

当然,在C++11中,当你的表达式只有一个函数名(例如指数std::exp)时,该表达式具有函数&#39; s 地址作为它的价值。或者例如:

extern void fun(int); /// declare the function fun, defined elsewhere.
auto fp = fun;

然后fp是一个指向函数的指针,该函数接受一个参数,一个整数,并且不返回任何内容(void)。与fun类似,此指针fp保存函数的地址(一个名称),并使用函数地址初始化指针fun ()在 build 时完成(例如,通过编译器和链接器,在运行时没有任何反应)。因此std::cout << fp << std::endl将输出一些布尔标志(不是名称)。 std::cout << fun << std::endl也是如此。并且std::cout << (void*)fp << std::endl会输出一些地址。

阅读Levine的Linkers and loaders一书,了解有关符号的更多信息(例如函数名称)。

在Linux上,您可以使用dladdr(3)获取函数地址的(mangled)名称(假设某些ELF中有一些全局名称}文件,你没有strip二进制文件,并与适当的选项相关联 - 例如-rdynamic)。

在C ++ 11中,某些函数没有任何名称(有些函数可能没有任何全局名称)。阅读lambda expressions&amp; closures。另请参阅std::function