gpt4 book ai didi

c++ - 如何获取函数的地址?

转载 作者:行者123 更新时间:2023-11-28 01:55:43 45 4
gpt4 key购买 nike

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

假设函数为“int function_address()”,代码如b

cout<<function_address<<endl;

最佳答案

The address of function is its name with bracket

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

一般情况下,您无法从函数地址中获取函数名称。

当然,在C++11 ,当你有一个只有函数名称的表达式(例如指数 std::exp )时,该表达式将函数的 address 作为其值。或者例如:

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

然后 fp是一个指向函数的指针,该函数接受一个参数,一个整数,并且不返回任何内容(void)。喜欢fun这个指针 fp保存函数的地址(不是一个名字),以及指针的初始化 fun函数 fun() 的地址在 build 时完成(例如,由编译器和链接器完成,在运行时什么也不会发生)。因此 std::cout << fp << std::endl会输出一些 bool 标志(不是名字)。 std::cout << fun << std::endl也是如此.和 std::cout << (void*)fp << std::endl会输出一些地址。

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

特别是在 Linux 上,您可以使用 dladdr(3)获取函数地址的 ( mangled ) 名称(假设它在某些 ELF 文件中有一些 global 名称,而您没有 strip 二进制文件,并与适当的选项链接 -例如 -rdynamic )。

在 C++11 中,有些函数没有任何名称(有些函数可能没有任何全局 名称)。了解 lambda expressions & closures .另见 std::function .

关于c++ - 如何获取函数的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41264192/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com