繁体   English   中英

为什么要使用'extern “C++”'?

[英]Why would you use 'extern “C++”'?

本文中,关键字 extern 后面可以跟“C”或“C++”。 为什么要使用'extern "C++"'? 实用吗?

语言允许:

extern "C" {
  #include "foo.h"
}

如果 foo.h 包含需要 C++ 链接的内容怎么办?

    void f_plain(const char *);
    extern "C++" void f_fancy(const std::string &);

这就是让 linker 开心的方式。

没有真正的理由使用extern "C++" 它只是明确了作为隐式默认值的链接。 如果您有一个 class,其中某些成员具有外部“C”链接,您可能希望显式 state 其他成员是外部“C++”。

请注意,C++ 标准在语法上定义了extern "anystring" 它只赋予extern "C"extern "C++"正式的含义。 如果他们愿意,编译器供应商可以自由定义extern "Pascal"甚至是extern "COM+"

我不确定您为什么需要这样做,但根据 Sun 的这篇文章,您可以在 extern "C" 块内使用 extern "C++" 来指定一组 "C" 函数中的某些函数具有原生 C++ 联动。

extern "C" {
    void f();             // C linkage
    extern "C++" {
        void g();         // C++ linkage
        extern "C" void h(); // C linkage
        void g2();        // C++ linkage
    }
    extern "C++" void k();// C++ linkage
    void m();             // C linkage
}

两种猜测:

  • 如果您在extern "C"块中,则可以通过指定嵌套的extern "C++"再次获得 C++ 语言链接。
  • 它保留C++链接,因为它是定义 C++ 的文档。 谁在定义C++语言链接方面比它本身更好。 它还提供了完整性。 与已signed/unsigned的交易相同。

阅读这个解释extern "LanguageName"的答案(即 GCC 有extern "Java" )。

外部“C”被许多人回答。 extern "C++" 的用例是在 C ZC1C425267E1783 中调用 C++ 库 function 时。 相关的子用例是将 C++ 库与 C 源代码与主 function 链接时。 查看此wiki 页面以获取更多详细信息:

C 和 C++ 使用不同的名称修改规则 本质上,extern "C" 告诉 C++ 编译器将 function 命名为 C 将命名它。

这指定要使用的链接约定。 大多数语言都知道如何与“C”风格的 function 链接。

在两种情况下你需要这个:

  • C - 或其他语言 - 调用 function 编写的 C++ 程序
  • 一个 C++ 程序调用用 C 编写的 function

例子:

// declared in function.h
void f1(void);

Your C code - actually other languages are able to link with C function - will not be able to link to it because the name in the object table will use C++ convention.

如果你写

extern "C" void f1(void);

现在链接有效,因为它使用 C 约定。

我使用 extern "C" 的 #1 原因是为了避免 C++ 的名称修改规则。 如果您使用 .Net 语言并想要 PInvoke 到特定的本地 function,这非常重要。 这样做的唯一方法是禁用名称修改。

回答第二个问题,“实用吗?”:

在像<cmath>这样的标准头文件中,这是实用的,而且实际上是不可避免的。

想象一个只有头文件的库 Xh,用 C++ 和 C 的公共子集编写,并打算在两种语言中使用。 为了 C++ 用户的利益,Xh 包括<cmath> ,而不是<math.h> 但是,这对 C 用户不起作用,如果<cmath>的作者没有将所有内容都夹在extern "C++" { ... }中。

简短的回答是,您可以使用 extern C 告诉编译器不要使用名称修饰。 这意味着您可以将同一项目中的 C 和 C++ 代码位链接在一起。

extern "C" 用于表示 C++ function 应该具有 C 链接。 这意味着依赖于实现,但通常它会关闭 C++ 名称修改(以及重载和严格的类型检查)。 当你有一个 C++ function 你想从 C 代码中调用它时,你可以使用它:

extern "C" void Foo();   // can be called easily from C

至于外部“C++”,我从未在实际代码中见过它,尽管 C++ 标准允许它。 我想这是一个无操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM