c++中如何获取函数名,和获取到一个基类指针后,如何判断它里面保存的是那个子类类型对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中如何获取函数名,和获取到一个基类指针后,如何判断它里面保存的是那个子类类型对象?相关的知识,希望对你有一定的参考价值。

参考技术A 除非编译成动态库,导出表里才会有函数名,否则程序中不含有函数名。
获取指针指向的实际类型,需要用到RTTI,主要是typeid运算符,它返回一个type_info对象,其中包含指针所指对象的类型信息。

Base* ptr = get_ptr();

if (typeid(*ptr) == typeid(Derived1))

cout << "ptr points to a Derived1 object" << endl;

else if (typeid(*ptr) == typeid(Derived2))

cout << "ptr points to a Derived2 object" << endl;
参考技术B 欢迎到河南新华参观了解 免费试听课程 报销路费

C++,获取函数名

【中文标题】C++,获取函数名【英文标题】:C++, get the name of the function 【发布时间】:2010-06-20 10:09:53 【问题描述】:

在 C++ 中,有没有办法像这样从它的指针中获取函数签名/名称?

void test(float data) 
cout << typeid(&test).name();

我想使用这些数据进行日志记录。

【问题讨论】:

可能重复:***.com/questions/41453/…***.com/questions/359237/… 我们必须假设你使用的是函数指针变量,否则写成cout &lt;&lt; "void test(float)";? 【参考方案1】:

C++,通过指针获取调用函数的名称:

选项 1:滚动您自己的函数名称记录器

如果您想将“指向函数的指针”解析为“函数名”,您需要创建自己的所有可用函数的查找表,然后将您的指针地址与查找表中的键进行比较,然后返回名称。

此处描述的实现:https://***.com/a/8752173/445131

选项 2:使用__func__

GCC 提供了这个以字符串形式保存当前函数名称的神奇变量。它是 C99 标准的一部分:

#include <iostream>
using namespace std;
void foobar_function()
    cout << "the name of this function is: " << __func__ << endl;

int main(int argc, char** argv) 
    cout << "the name of this function is: " << __func__ << endl;
    foobar_function();
    return 0;

输出:

the name of this function is: main
the name of this function is: foobar_function

注意事项:

__FUNCTION____func__ 的另一个名称。旧版本的 GCC 仅识别此名称。但是,它并不标准化。如果需要最大的可移植性,我们建议您使用__func__,但使用预处理器提供一个回退定义,如果未定义则对其进行定义:

 #if __STDC_VERSION__ < 199901L
 # if __GNUC__ >= 2
 #  define __func__ __FUNCTION__
 # else
 #  define __func__ "<unknown>"
 # endif
 #endif

来源:http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

【讨论】:

谢谢,方法2在C++11(GCC)也可以用,我用的是ubuntu16。 还有办法获取签名吗? (即int main (int, char**) 或类似的?)【参考方案2】:

如果你只想记录当前函数名,大多数编译器都有__FUNCTION__宏,它会在编译时给你当前函数名。

您还可以寻找堆栈遍历技术(这里是an example for Windows),它可以为您提供有关当前调用堆栈和运行时函数名称的更多信息。

【讨论】:

不是__func__吗? gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html 声明这在技术上不是宏。 __func__ 是标准的,它必须在那里; __FUNCTION__ 可能是一些非标准的。 __PRETTY_FUNCTION__ 也值得一提。【参考方案3】:

您无法获得函数的名称。只是因为它不驻留在可执行文件中。在您的代码编译和链接后,它会完全消失。

您可以尝试重命名您的函数/变量,并且您的可执行文件将是相同的(除了编译器可能放置的可变内容,例如构建日期/时间、调试信息 ID 等)

还可以尝试使用一些编辑器打开可执行文件并查找函数名称。你很可能找不到它。

不过,您可以添加一些程序化“装饰”,以帮助您在运行时发现您的函数名称。

【讨论】:

这部分是不正确的。如果函数名是公开的,它们确实驻留在可执行文件/库中。否则它们不能被外部调用。这些名称被称为“符号”【参考方案4】:

您无法在 C++ 中获取函数的名称,但您可以打印指针并稍后检查二进制文件(如果未剥离)以获取函数名称。签名可以完全按照您的方式打印,只是类型名称不是真正的“人类可读”。检查您的编译器文档以了解代码输出的含义。在 g++ 中,输出将是 PFvfE,我不完全理解,但它标识了一个指向函数 (F) 的指针 (F) 返回 void (v) 并采用浮点数 (f ) 作为单个参数。不要问我E是什么...

(我现在没有时间查看文档,我只是玩了一个示例程序来猜测:打印不同的函数签名)

【讨论】:

【参考方案5】:

我不能 100% 确定,但这在我看来就像反射 (Java),而 C++ 不支持这样的东西。可能是我不知道,但我还没有看到 C++ 的这个。

【讨论】:

以上是关于c++中如何获取函数名,和获取到一个基类指针后,如何判断它里面保存的是那个子类类型对象?的主要内容,如果未能解决你的问题,请参考以下文章

C++:在不知道函数名的情况下获取当前函数指针?

如何从指向基类类型的指针调用派生类函数(C++)

在 C++ 中将派生类对象分配和访问到基类“指向指针”对象

c++ 怎样从任意类获取CDocument类指针

如何获取在 C++ 中排序后保留的列表元素的指针

C++ 类成员函数地址