为什么你会用'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。 唯一的办法就是禁用名字禁止。