函数的地址是带括号的名称。但是,当我使用cout打印出地址时,这是错误的。
假设函数是" int function_address()"和代码如b
cout<<function_address<<endl;
答案 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。