c – 使用extern“C”连接的过载分辨率

前端之家收集整理的这篇文章主要介绍了c – 使用extern“C”连接的过载分辨率前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在一个混合的C/C++项目中,我们需要从C调用C函数.被调用函数被重载为三个单独的函数,但是我们可以从C侧忽略这个函数,我们只选择一个最适合的那个.

有两种方法可以做到这一点:(1)使用一个外部“C”函数编写一个小的C包装器,该函数调用转发到所选择的重载函数,或者(2)黑客方法来声明我们要调用的一个函数C作为extern“C”.

问题是,第二个变种有什么缺点(除了恶梦和坏业力)吗?换句话说,给定三个过载的函数,哪里被声明为ex“C”,我们应该期待C方面的麻烦,还是根据标准定义好?

解决方法

我曾表示这是未定义的,但重读标准,我找不到我以为是那里的语言.实际上,§7.5/ 3的示例代码似乎表明结果大概是定义的 – 即只要有一个具有“C”连接的函数就可以使用C连接的其他重载.他们的例子是:
complex sqrt(complex); // C + + linkage by default
extern "C" {
    double sqrt(double); // C linkage
}

两点:1)举个例子,这不是规范性的. 2)它不直接声明这两个声明实际上是允许在同一个程序中.尽管如此,我认为它的意图是它可以被看作是一个单一的代码段,它给出了定义的行为.

在重读之后,我相信标准中的语言是专门用于写出一个具有“C”连接的函数,以及任意数量的具有“C”连接的其他函数,它们重载相同的名称(§7.5/ 6):

At most one function with a particular name can have C language linkage. Two declarations for a function with C language linkage with the same function name (ignoring the namespace names that qualify it) that appear in different namespace scopes refer to the same function. Two declarations for an object with C language linkage with the same name (ignoring the namespace names that qualify it) that appear in different namespace scopes refer to the same object.

原文链接:https://www.f2er.com/c/114538.html

猜你在找的C&C++相关文章