我希望能够做到这样的事情:
if (Is_Function("helloworld")
// Run code
答案 0 :(得分:7)
简单回答:没有
复杂答案:是的,如果打开调试符号并编写一些辅助函数来查看调试符号。但这真的很糟糕,错误(函数可以自动内联,并且会在符号表中神奇地消失),并且大多数都会在构建程序的发布版本后立即停止工作。
最终答案:否
答案 1 :(得分:3)
不是正常意义上的,因为C ++不支持反射。您可以使用调试信息编译程序并使其自行打开并像调试器那样读取其符号表,但这可能比它的价值更麻烦。
无论如何,为什么需要在运行时检测函数的存在?这在编译时就知道了。
如果您可以将可能包含该函数的部分分离到动态库中,则可以在运行时将其打开并对其进行符号查找。 (在Linux系统上,您使用dlopen()
和dlsym()
;在其他平台上有等价物,但我不知道他们的名字。)这将告诉您该名称是否作为符号存在,虽然它不会告诉你它是否是一个功能。
答案 2 :(得分:2)
您可以在基于ELF的系统(Linux和大多数Unix变体,包括MacOS X)上使用的一种技术是与-rdynamic
链接,然后调用dlsym(RTLD_DEFAULT, "helloworld")
以获取指向该函数的指针helloworld
如果它存在于当前可执行文件或已加载的任何共享库中。由于名称修改,这会导致C ++出现问题,因此实际上只适用于使用extern "C"
或C代码声明的函数。
答案 3 :(得分:0)
好吧,当使用信号和插槽时,Qt做了类似的事情,但是这些功能将被注册在一个名为iirc的错误索引的地图中。这种注册是通过他们的“MetaObject编译器”实现的,它基本上是一个预处理器/代码生成器并且静态工作。
根据您的目的,您可以使用Qt。
另一种可能性是编译共享库并使用dlsym(如果在您的系统上可用)。