在我的代码中的某些情况下,我最终只在定义了该函数时才调用该函数,否则就不应该调用该函数。我如何才能做到这一点?
like:
if (function 'sum' exists ) then invoke sum ()问这个问题的另一种方式可能是:如何确定函数是否在运行时定义,如果是,则调用。
发布于 2012-01-11 14:03:18
虽然其他回复是有用的建议(dlsym、函数指针等),但不能引用不存在的函数来编译 C++代码。至少,必须声明函数;否则,您的代码将无法编译。如果没有任何东西(编译单元、某个目标文件、某个库)定义函数,链接器就会报错(除非它很弱,见下文)。
但你真的应该解释一下你为什么要问这个问题。我不能猜测,有一些方法可以实现你未陈述的目标。
请注意,dlsym通常需要不带name mangling的函数,即声明为extern "C"。
如果在Linux上使用GCC进行编码,也可以在声明中使用weak function attribute。然后,链接器将未定义的弱符号设置为null。
附录
如果你是从一些输入中获得函数名,你应该意识到只有函数的一个子集应该是可调用的(如果你不小心调用一个任意函数,它将会崩溃!)你最好显式地构造这个子集。然后,您可以使用std::map或dlsym (子集内的每个函数都声明为extern "C")。请注意,具有NULL路径的dlopen提供了主程序的句柄,您应该使用-rdynamic链接主程序以使其正常工作。
您真的希望根据它们的名称只调用适当定义的函数子集。例如,您可能不希望以这种方式调用abort、exit或fork。
注意:如果您动态了解被调用函数的签名,则可能需要使用libffi来调用它。
发布于 2012-01-11 13:54:20
当你声明'sum‘时,你可以像这样声明它:
#define SUM_EXISTS
int sum(std::vector<int>& addMeUp) {
...
}然后,当你使用它的时候,你可以去:
#ifdef SUM_EXISTS
int result = sum(x);
...
#endif我猜你来自一种脚本语言,所有的事情都是在运行时完成的。使用C++需要记住的主要内容是两个阶段:
在机器code中,
所以所有的#define和类似的事情都会在编译时发生。
……
如果你真的想在运行时完成这一切..您可能会对使用一些component architecture products感兴趣。
或者,也许你想要的是plugin kind of architecture。
发布于 2013-08-02 02:57:13
我怀疑发帖者实际上是在寻找更类似于SFINAE检查/调度的东西。使用C++模板,可以定义模板函数,一个调用所需函数(如果存在),另一个不执行任何操作(如果函数不存在)。然后,您可以使第一个模板依赖于所需的函数,这样当该函数不存在时,该模板的格式是错误的。这是有效的,因为在C++中,模板替换失败不是一个错误(SFINAE),所以编译器只会退回到第二种情况(例如,不能做任何事情)。
这里有一个很好的例子:Is it possible to write a template to check for a function's existence?
https://stackoverflow.com/questions/8814705
复制相似问题