【问题标题】:Getting the address of a function's caller?获取函数调用者的地址?
【发布时间】:2026-01-30 18:00:01
【问题描述】:

我正在使用__func__ 作为参数之一调用函数,因此我可以存储调用该函数的函数的名称,而无需重新键入调用函数的名称。

有没有办法同时获取调用函数的地址 - 一种getaddress(__func __) ??

【问题讨论】:

  • 在标准 C++ 中,没办法。可能使用深度组装级别的非标准黑客。但这超出了我的专业领域。
  • 您的问题标题表明您需要__func__ 字符数组的地址——表达式__func__ 已经给了您。但我认为你真正想要的是一个函数指针值,它是调用函数的地址。你不会从__func__ 那里得到它,它只是一个静态字符数组。
  • 是的,我发现了一些骇人听闻的方法,但它们非常依赖于实现。
  • 是的 - 我想要一个可以打电话的地址。这个例子只是为了说明我真正追求的是什么。
  • 我认为信息不会存储在任何地方,即使您直接使用 asm。

标签: c++


【解决方案1】:

地址不会告诉你太多;我可以建议使用预定义的宏 __FILE____LINE__ 吗?他们会告诉你当前的源文件(char*)和当前行。当您调用将这些作为参数传递的函数时,您会知道该函数是从哪个文件/行调用的。

编译器在使用时对其进行评估。如果您在函数内部使用它们,而不是将它们作为参数传递,它们会告诉您函数本身的文件/行。

【讨论】:

  • 我不想将它们用作某种调试。我正在尝试构建一个调用表,而无需两次明确地重新键入函数名称。
  • 用.map文件创建编译,解析地图文件。但是 C++ 名称将被破坏。地图文件是穷人的调试符号...
【解决方案2】:

您可以声明函数指针,然后为它们分配特定的函数。那么你可以有一个数组或其他指针集合作为你的表。

如果这对您有用并且您接受答案,我愿意回来并在这里创建一个简短的摘要。 (我知道我不应该只用一个链接来回答。)但是看看这种方法是否能满足你的要求。 https://www.learncpp.com/cpp-tutorial/78-function-pointers/

【讨论】:

    【解决方案3】:

    没有可移植的标准 C++ 方法来执行此操作。您可以使用编译器/操作系统特定的 hack,as in C 也是如此,但它在 C++ 中的用处不大,因为它仅适用于 extern "C" 名称(其中 __FUNCTION__/__func__dlsym 期望的匹配)。

    由于该 hack 仅适用于 extern "C" 名称,这意味着您不能将其用于模板函数、类方法或函数重载(相同的函数名称,不同的参数原型),这是相当严格的。请注意,在某些情况下,即使输入函数名称也不起作用(例如,名称本身并不能描述原型,因此函数重载不起作用)。

    我认为你需要重新考虑一个本质上要求很高的设计reflection in C++;优化编译器的本质是您定义的大多数函数实际上并不一定存在,或者如果它们存在,它们只存在于除了编译器之外对任何东西都没有意义的名称。当您要求从函数内部动态确定当前函数的地址时,您假设该函数存在,并且在最终编译的二进制文件中具有实际地址,而它可以很容易地内联到每个实际调用站点中,部分与几乎相同的功能合并,等等。

    【讨论】: