[英]Why would you use '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 链接。
在两种情况下你需要这个:
例子:
// 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.