C++ 为什么要使用';“外部”;C++&引用';?
在这种情况下,关键字extern后面可以跟“C”或“C++”。为什么要使用“extern”C++?实用吗?语言允许:C++ 为什么要使用';“外部”;C++&引用';?,c++,c,C++,C,在这种情况下,关键字extern后面可以跟“C”或“C++”。为什么要使用“extern”C++?实用吗?语言允许: extern "C" { #include "foo.h" } 如果Fo.h包含了需要C++链接的东西,那会怎样呢?p> void f_plain(const char *); extern "C++" void f_fancy(const std::string &); 这就是让链接器满意的方法。简短的回答是,您可以使用extern C告诉编译器
extern "C" {
#include "foo.h"
}
如果Fo.h包含了需要C++链接的东西,那会怎样呢?p>
void f_plain(const char *);
extern "C++" void f_fancy(const std::string &);
这就是让链接器满意的方法。简短的回答是,您可以使用extern C告诉编译器不要使用名称篡改。这意味着你可以把C++和C++代码中的位链接到同一个项目中。 < P> C和C++使用不同的。本质上,外部“C”告诉C++编译器以C命名的函数命名函数。 < P> Extn“C”是用来表示C++函数应该具有C连接。这意味着依赖于实现,但通常它会关闭C++名称的修改(以及重载和严格类型检查)。当你有一个C++函数时,你可以使用它:C代码:< /P>
extern "C" void Foo(); // can be called easily from C
至于“C++”,我从未见过它,虽然C++标准允许它。我想这是个禁忌。
没有真正的理由使用extern“C++”
。它只是显式地建立了链接,这是隐式默认值。如果您有一个类,其中一些成员具有extern“C”链接,那么您可能希望显式声明其他成员是extern“C++”
注意C++标准在语法上定义了代码>外部的“任意字符串”< /代码>。它只赋予
extern“C”
和extern“C++”
形式上的含义。编译器供应商可以自由定义extern“Pascal”
甚至extern“COM+”
,如果他们愿意的话。这将指定要使用的链接约定。大多数语言都知道如何与“C”风格的函数链接
在两种情况下需要此选项:
- 调用用C编写的函数的C语言或其他语言程序++
- 调用C++程序编写的函数C++程序
// declared in function.h
void f1(void);
<>您的C代码-实际上其他语言都能与C函数链接-将不能链接到它,因为对象表中的名称将使用C++约定。
如果你写信
extern "C" void f1(void);
现在链接工作了,因为它使用C约定。两个猜测:
C++
语言链接方面,谁比它本身更合适。它还提供了完整性。与已签名/未签名
的处理相同李>
阅读这篇文章也解释了
extern“LanguageName”
(即GCC有extern“Java”
)。我使用extern“C”的第一个原因是为了避免C++的名称混乱规则。如果您使用的是.Net语言,并且希望将PInvoke转换为特定的本机函数,那么这一点非常重要。唯一的方法是用名字来命名禁用。我不知道为什么你需要这么做,但是根据Sun的文章,你可以在一个外部的“C”中使用ExtLeN+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
}
外部“C”的答案很多。在C函数中调用C++库函数时,外部“C++”的使用情况。子用例是相关的,当将C++库与C源代码连接起来时,主要功能是。查看此项了解更多详细信息:要回答第二个问题,“它实用吗?”: 在像
这样的标准标题中,它是实用的,而且实际上是不可避免的
想象一个头文件库X.h,用C++和C的一个公共子集编写,并打算从两种语言中使用。为了C++用户的利益,X.h包含了<>代码>代码>,而不是<代码> <代码>。不过,如果
的作者将所有东西都放在外部“C++”{
..}
中,这对C用户来说是不起作用的,但是,问题主体也会问James回答的问题。外部“C”很容易被谷歌搜索到,但是外部“C++”是一个有趣的问题,如果我错了,它会被收回!在我看来,这是一个关于你为什么要使用这两种方法的问题。现在有更好的答案,所以这没关系。我不理解反对票。这是一个使用Exc++ C++的用例,它是合法的,我也不理解。它是extern“C++”的有效用法,不仅有效,我还看到它在野外使用(这是我的“啊哈”时刻)。看看winnt.h.别担心;我投了赞成票,因为投了反对票,否则我就不会投了。不是因为它不值得投票支持,而是因为我根本没有想过要投票支持它。事实上,名称混乱纯粹是一个实现细节。这些语言本身根本没有混乱的“规则”。不同的编译器处理函数重载的方式不同。名称篡改只是一种流行的方法。不过,这是一个好问题,欢迎使用堆栈溢出:)这篇文章现在正在发表,这确实是对这个问题的完美回答。如果可以的话,我会给你更多的选票。当你需要覆盖周围的其他链接规范时,你会用到它。我希望编译器支持“代码>外部”Haskell“< /Cord>”。实际上,它主要用于反向:从C++代码调用C函数。如果你在C++代码中调用<代码> Prtff>代码,链接需要知道它在库中是<代码> Prtff < /C> >而不是<代码> Prtffy$d%g^和& ^ ^ /代码>这可能是处理包含在一个外部部分中的头的情况。