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

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

概述在一个混合的C/C++项目中,我们需要从C调用C函数.被调用的函数被重载为三个单独的函数,但是我们可以从C侧忽略这个函数,我们只选择一个最适合的那个. 有两种方法可以做到这一点:(1)使用一个外部“C”函数编写一个小的C包装器,该函数将调用转发到所选择的重载函数,或者(2)黑客方法来声明我们要调用的一个函数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 defaultextern "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.

总结

以上是内存溢出为你收集整理的c – 使用extern“C”连接的过载分辨率全部内容,希望文章能够帮你解决c – 使用extern“C”连接的过载分辨率所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1247687.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存