当前位置: 首页 > 面试题库 >

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

晏晨朗
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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

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

附加物

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

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

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



 类似资料:
  • 我想确定C 11中是否存在一个文件 我有以下代码: 和 哪一个是正确的和惯用的?

  • 我正在使用fstream库来处理文件。基本上,我需要知道某个文件是否存在。在c留档online中,关于open(),它是这样的: 返回值 没有一个 如果函数无法打开文件,则会为流设置failbit状态标志(如果使用成员异常注册该状态标志,则可能引发ios\U base::failure)。 它说没有指定返回值。但在失败的情况下,会设置一个标志。我的问题是,我应该访问该标志,或者更好地问,我应该如何

  • 问题内容: 我有一个fstream my_file(“ test.txt”),但我不知道test.txt是否存在。如果存在,我也想知道是否也可以阅读。怎么做? 我使用Linux。 问题答案: 我可能会选择: 该方法检查流是否准备好从中读取。

  • 问题内容: 因此,我有使用Firefoxseleniumwebdriers的c#winform。 基本上我需要它来检查元素是否存在以及是否不单击其他元素。如果有视频,观看后会变成W_VIEWED 这是我到目前为止所得到的 错误3仅赋值,调用,递增,递减,等待和新对象表达式可以用作语句242 C#selenium的新种类。谢谢你的帮助。 问题答案: 您可以检查元素出口或不使用 请记住,如果找不到元素

  • 问题内容: 我正在创建一个存储函数,该函数应该在表中插入新行。该表中还有一个唯一列。 如何检查一切是否顺利,是否确实插入了行? 我如何才能准确地检查是否找到此唯一列(例如-尝试添加重复值)? 问题答案: 您可以检查LAST_INSERT_ID()函数和INSERT IGNORE。 如果INSERT IGNORE成功,则返回主键。让我们创建一个带有自动递增主键和名称上的唯一键的表。 这是正在运行的示

  • 本文向大家介绍C#中如何检查线程是否处于活动状态,包括了C#中如何检查线程是否处于活动状态的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否存在,代码如下: 示例 输出结果 这将产生以下输出- 示例 现在让我们来看另一个示例- 输出结果 这将产生以下输出-