首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C/C++中检查函数是否存在

如何在C/C++中检查函数是否存在
EN

Stack Overflow用户
提问于 2012-01-11 13:41:24
回答 9查看 55.5K关注 0票数 34

在我的代码中的某些情况下,我最终只在定义了该函数时才调用该函数,否则就不应该调用该函数。我如何才能做到这一点?

代码语言:javascript
复制
like:
if (function 'sum' exists ) then invoke sum ()

问这个问题的另一种方式可能是:如何确定函数是否在运行时定义,如果是,则调用。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-01-11 14:03:18

虽然其他回复是有用的建议(dlsym、函数指针等),但不能引用不存在的函数来编译 C++代码。至少,必须声明函数;否则,您的代码将无法编译。如果没有任何东西(编译单元、某个目标文件、某个库)定义函数,链接器就会报错(除非它很弱,见下文)。

但你真的应该解释一下你为什么要问这个问题。我不能猜测,有一些方法可以实现你未陈述的目标。

请注意,dlsym通常需要不带name mangling的函数,即声明为extern "C"

如果在Linux上使用GCC进行编码,也可以在声明中使用weak function attribute。然后,链接器将未定义的弱符号设置为null。

附录

如果你是从一些输入中获得函数名,你应该意识到只有函数的一个子集应该是可调用的(如果你不小心调用一个任意函数,它将会崩溃!)你最好显式地构造这个子集。然后,您可以使用std::mapdlsym (子集内的每个函数都声明为extern "C")。请注意,具有NULL路径的dlopen提供了主程序的句柄,您应该使用-rdynamic链接主程序以使其正常工作。

您真的希望根据它们的名称只调用适当定义的函数子集。例如,您可能不希望以这种方式调用abortexitfork

注意:如果您动态了解被调用函数的签名,则可能需要使用libffi来调用它。

票数 15
EN

Stack Overflow用户

发布于 2012-01-11 13:54:20

当你声明'sum‘时,你可以像这样声明它:

代码语言:javascript
复制
#define SUM_EXISTS
int sum(std::vector<int>& addMeUp) {
    ...
}

然后,当你使用它的时候,你可以去:

代码语言:javascript
复制
#ifdef SUM_EXISTS
int result = sum(x);
...
#endif

我猜你来自一种脚本语言,所有的事情都是在运行时完成的。使用C++需要记住的主要内容是两个阶段:

在机器code中,

  • 编译时
    • 预处理器运行
    • 模板代码转换为真正的源代码
    • 源代码转换

  • runtime
    • 机器代码为run

所以所有的#define和类似的事情都会在编译时发生。

……

如果你真的想在运行时完成这一切..您可能会对使用一些component architecture products感兴趣。

或者,也许你想要的是plugin kind of architecture

票数 18
EN

Stack Overflow用户

发布于 2013-08-02 02:57:13

我怀疑发帖者实际上是在寻找更类似于SFINAE检查/调度的东西。使用C++模板,可以定义模板函数,一个调用所需函数(如果存在),另一个不执行任何操作(如果函数不存在)。然后,您可以使第一个模板依赖于所需的函数,这样当该函数不存在时,该模板的格式是错误的。这是有效的,因为在C++中,模板替换失败不是一个错误(SFINAE),所以编译器只会退回到第二种情况(例如,不能做任何事情)。

这里有一个很好的例子:Is it possible to write a template to check for a function's existence?

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8814705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档