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

新手上路,请多包涵

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

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

也许问这个问题的另一种方式是如何确定函数是否在运行时定义,如果是,那么调用?

原文由 Whoami 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

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

但是您应该真正解释为什么要问这个问题。我无法猜测,并且有一些方法可以实现您未说明的目标。

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

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

附加物

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

你真的只想用他们的名字来调用一个适当定义的函数子集。例如,您可能不想这样调用 abortexitfork

注意。如果你 动态 知道被调用函数的签名,你可能想使用 libffi 来调用它。

原文由 Basile Starynkevitch 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 GCC,您可以:

 void func(int argc, char *argv[]) __attribute__((weak)); // weak declaration must always be present

// optional definition:
/*void func(int argc, char *argv[]) {
    printf("ENCONTRE LA FUNC\n");
    for(int aa = 0; aa < argc; aa++){
        printf("arg %d = %s \n", aa, argv[aa]);
    }
}*/

int main(int argc, char *argv[]) {
    if (func){
        func(argc, argv);
    } else {
        printf("no encontre la func\n");
    }
}

如果您取消注释 func 它将运行它,否则它将打印“no encontre la func\n”。

原文由 Jose Luis Quiroga Beltran 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题