在我的代码中的某些情况下,我最终只在定义了该函数时才调用该函数,否则我不应该。我怎样才能做到这一点?
like:
if (function 'sum' exists ) then invoke sum ()
也许问这个问题的另一种方式是如何确定函数是否在运行时定义,如果是,那么调用?
原文由 Whoami 发布,翻译遵循 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 许可协议
7 回答5.3k 阅读
3 回答2k 阅读✓ 已解决
4 回答4k 阅读
2 回答3.9k 阅读✓ 已解决
2 回答5.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
虽然其他回复是有用的建议(
dlsym
,函数指针,…),但您 不能编译 引用不存在的函数的 C++ 代码。至少,必须 声明 函数;如果不是,您的代码将无法编译。如果没有(编译单元、某个目标文件、某个库) 定义 该函数,则链接器会抱怨(除非它很弱,见下文)。但是您应该真正解释为什么要问这个问题。我无法猜测,并且有一些方法可以实现您未说明的目标。
请注意
dlsym
通常需要没有 名称 修饰的函数,即声明为extern "C"
。如果使用 GCC 在 Linux 上编码,您还可以在声明中使用
weak
函数属性。然后链接器会将未定义的弱符号设置为空。附加物
如果您从某些输入中获取函数名称,您应该知道只有一部分函数应该可以这样调用(如果您不小心调用任意函数,它会崩溃!)并且您最好显式地构造该子集.然后,您可以使用
std::map
或dlsym
(子集中的每个函数都声明为extern "C"
)。请注意,dlopen
带有NULL
路径提供了主程序的句柄,您应该将其与-rdynamic
链接以使其正常工作。你真的只想用他们的名字来调用一个适当定义的函数子集。例如,您可能不想这样调用
abort
、exit
或fork
。注意。如果你 动态 知道被调用函数的签名,你可能想使用 libffi 来调用它。