一尘不染

如何检查该功能是否存在于C / C ++中

linux

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

like:
if (function 'sum' exists ) then invoke sum ()

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


阅读 299

收藏
2020-06-02

共1个答案

一尘不染

尽管其他答复是有用的建议(dlsym,函数指针等),但是您 不能编译 引用不存在的函数的C ++代码。至少必须 声明
函数;如果不是,您的代码将无法编译。如果没有任何内容(编译单元,某些目标文件,某些库) 定义 该函数,则链接器会抱怨(除非它很弱,请参见下文)。

但是您应该真正解释为什么要问这个。我猜不到,有一些方法可以实现您的目标。

注意,dlsym通常需要不带名称修饰的函数,即声明为extern "C"

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

附加物

如果要从某个输入中获取函数名称,则应注意,只有那种方法的子集应该可以那样调用(如果不加小心地调用任意函数,它将崩溃!),并且最好更好地构造该子集。然后std::map,您可以使用或dlsym((声明子集中的每个函数extern "C")。注意,dlopen使用NULL路径可以给主程序提供一个句柄,您应该将其链接-rdynamic以使其正常工作。

您确实希望仅通过它们的名称来调用适当定义的函数子集。例如,你可能不希望把这种方式abortexitfork

注意 如果您 动态地 知道被调用函数的签名,则可能要使用libffi对其进行调用。

2020-06-02