C++ 为什么要使用';“外部”;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”或“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告诉编译器不要使用名称篡改。这意味着你可以把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”/Cux>块中,您可以通过指定嵌套的<代码>外部“C++”< /C> >来获得C++语言链接。 它保留了代码> C++ +/COD>链接,因为它是定义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^和& ^ ^ /代码>这可能是处理包含在一个外部部分中的头的情况。