为什么你会用'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 &); 

这就是你如何保持链接器快乐。

没有真正的理由使用extern "C++" 。 它只是明确隐含的默认联系。 如果你有一个类有一些外部“C”连接的类,你可能希望明确说明其他的是外部的“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函数中调用C ++库函数的时候。 这个相关的子使用案例是将C ++库与具有main函数的C源代码链接起来。 检查这个维基页面的更多细节:

C和C ++使用不同的名称修改规则 。 实际上,extern“C”告诉C ++编译器命名该函数,因为C会命名它。

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

你需要在两种情况下:

  • AC – 或者其他语言 – 程序调用用C ++编写的函数
  • 调用C语言编写的函数的C ++程序

例如:

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

你的C代码 – 实际上其他语言能够链接到C函数 – 将无法链接到它,因为对象表中的名称将使用C ++约定。

如果你写

 extern "C" void f1(void); 

现在链接工作,因为它使用C约定。

extern“C”用来表示C ++函数应该有C链接。 这意味着依赖于实现,但是它closures了C ++的名称 – 修改(以及重载和严格的types检查)。 当你想从C代码中调用C ++函数时使用它:

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

至于extern“C ++”,我从来没有在真正的代码中看到它,尽pipeC ++标准允许它。 我想这是一个没有操作。

简单的答案是,您可以使用extern C来告诉编译器不要使用名称修改。 这意味着您可以在同一个项目中将C和C ++代码连接在一起。

我使用extern“C”的第一个原因是为了避免C ++的名字修改规则。 这是非常重要的,如果你在一个.Net语言工作,并希望PInvoke到一个特定的本地function。 唯一的办法就是禁用名字禁止。