是否可以检查以字符串作为其名称的函数是否存在?(c++)
Is it possible to check if a function with a string as its name exists?(C++)
我希望能够做这样的事情:
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。
相关文章:
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 地图计数确实很重要,或者只是检查是否存在
- C++中是否存在 std::conditional 的懒惰等价物?
- 无论如何,我可以确定构造函数是否存在吗?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 堆分配的对象是否存在永不为空的唯一所有者?
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- 模板化检查是否存在带有参数列表的类成员函数?
- 是否存在包含负号的isdigit函数(过载)
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 检查编译时是否存在静态函数
- 向量是否存在行主要形式?
- 检查 TinyXML 中的元素是否存在
- 检测是否存在具有 C++17 的类成员
- 虚拟继承中是否存在多重继承?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?