是否可以检查以字符串作为其名称的函数是否存在?(c++)

Is it possible to check if a function with a string as its name exists?(C++)

本文关键字:是否 存在 函数 c++ 检查 字符串      更新时间:2023-10-16

我希望能够做这样的事情:

if (Is_Function("helloworld")
    // Run code

简单回答:no

复杂的答案:是的,如果调试符号是打开的,你写一些辅助函数来检查调试符号。但这真的很可怕,有很多bug(函数可以自动内联,并且会神奇地从你的符号表中消失),而且大多数情况下,一旦你构建了程序的发布版本,就会停止工作。

最终答案:no

不是一般意义上的反射,因为c++不支持反射。你可以用调试信息编译程序,让它像调试器一样打开自己,读取它的符号表,但这样做可能会带来更多的麻烦。

无论如何,为什么需要在运行时检测函数的存在?

如果你能把可能包含函数的部分分离到一个动态库中,你可以在运行时打开它并对它进行符号查找。(在Linux系统上,您将使用dlopen()dlsym();其他平台上也有类似的平台,但我不知道它们的名字。)这将告诉您名称是否作为一个符号存在,尽管它不会告诉您它是否是一个函数。

您可以在基于elf的系统(Linux和大多数Unix变体,包括MacOS X)上使用的一种技术是链接-rdynamic,然后调用dlsym(RTLD_DEFAULT, "helloworld")以获得指向函数helloworld的指针,如果它存在于当前可执行文件或任何已加载的共享库中。由于名称混淆,这在c++中存在问题,因此实际上只适用于用extern "C"声明的函数或C代码。

嗯,Qt在使用信号和插槽时做了这样的事情,但是然后这些函数将在一个由它们的名称iirc混淆索引的映射中注册。这个注册是由他们的"MetaObject编译器"实现的,它基本上是一个预处理器/代码生成器,并且静态工作。

根据你想做什么,你可以使用Qt。

另一种可能是编译一个共享库并使用dlsym,如果您的系统上有的话。