加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:30:36 所属栏目:百科 来源:网络整理
导读:在一个混合的C/C++项目中,我们需要从C调用C函数.被调用的函数被重载为三个单独的函数,但是我们可以从C侧忽略这个函数,我们只选择一个最适合的那个. 有两种方法可以做到这一点:(1)使用一个外部“C”函数编写一个小的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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读