在本文中,关键字extern后面可以带有“ C”或“ C ++”。为什么要使用“ extern“ C ++”“?实用吗?
在本文中,关键字extern后面可以带有“ C”或“ C ++”。为什么要使用“ extern“ C ++”“?实用吗?
Answers:
语言允许:
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"
块中,则可以通过指定nested重新获得C ++语言链接extern "C++"
。C++
链接,因为它是定义C ++的文档。谁在定义C++
语言链接方面比其本身更合适。它还提供了完整性。与相同signed/unsigned
。阅读此答案也可以解释extern "LanguageName"
(即GCC拥有extern "Java"
)。
答案“ C”的答案很多。外部“ C ++”的用例是在C函数中调用C ++库函数时。相关的用例是将C ++库与具有主要功能的C源代码链接时。检查此Wiki页面以获取更多详细信息:
C和C ++使用不同的名称处理规则。本质上,extern“ C”告诉C ++编译器将函数命名为C。
简短的答案是,您可以使用extern C告诉编译器不要使用名称修饰。这意味着您可以将同一项目中的C和C ++代码的各个部分链接在一起。
extern“ C”用来表示C ++函数应具有C链接。这意味着依赖于实现,但是通常它会关闭C ++名称处理(以及重载和严格的类型检查)。当您具有要从C代码调用的C ++函数时,可以使用它:
extern "C" void Foo(); // can be called easily from C
至于外部的“ C ++”,尽管C ++ Standard允许它,但我从未在实际代码中看到它。我猜这是没有操作的。
printf
C ++代码,则链接需要知道它在库中,printf
而不是在库中printf_#$D%G^_&_^