代码之家  ›  专栏  ›  技术社区  ›  Les

为什么要使用“外部”C++?

c c++
  •  65
  • Les  · 技术社区  · 15 年前

    article 关键字extern后面可以跟“C”或“C++”。为什么要使用“extern”C++?它实用吗?

    10 回复  |  直到 15 年前
        1
  •  113
  •   Thomas L Holaday    15 年前

    语言允许:

    extern "C" {
      #include "foo.h"
    }
    

    如果Fo.H包含了需要C++链接的东西呢?

        void f_plain(const char *);
        extern "C++" void f_fancy(const std::string &);
    

        2
  •  32
  •   James Curran    15 年前

    没有真正的理由使用 extern "C++"

    注意C++标准在句法上定义。 extern "anystring" . 它只赋予 extern "C" . 编译器供应商可以自由定义 extern "Pascal" 甚至 extern "COM+" 如果他们愿意的话。

        3
  •  22
  •   jeffm    8 年前

    我不知道你为什么要这么做,但根据 this Sun文章,可以使用外部“C++”在一个外部的“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
    }
    
        4
  •  6
  •   Community CDub    7 年前

    两种猜测:

    • 如果你在一个 extern "C" 块,可以通过指定嵌套来再次获得C++语言链接 extern "C++" .
    • C++ 链接,因为它是定义C++的文档。谁更适合定义 语言链接比它本身更重要。它还提供了完整性。一视同仁 signed/unsigned .

    阅读 this answer 这就解释了 extern "LanguageName" (即GCC已经 extern "Java" )还有。

        5
  •  4
  •   Starx    12 年前

    wiki page 有关详细信息:

        6
  •  2
  •   Pesto    15 年前

    C和C++使用不同 name mangling rules . 本质上,ExtEnter“C”告诉C++编译器以C命名的函数命名函数。

        7
  •  1
  •   Edouard A.    15 年前

    这将指定要使用的链接约定。大多数语言都知道如何与“C”风格的函数链接。

    在两种情况下需要此选项:

    • 一个C++程序调用C语言编写的函数

    例子:

    // declared in function.h
    void f1(void);
    

    extern "C" void f1(void);
    

    现在链接工作了,因为它使用C约定。

        8
  •  1
  •   JaredPar    15 年前

    我使用extern“C”的第一个原因是为了避免C++的名称混乱规则。如果您使用的是.Net语言,并且希望将PInvoke转换为特定的本机函数,那么这一点非常重要。唯一的方法是禁用名称损坏。

        9
  •  0
  •   Joachim W Paul Beckingham    3 年前

    要回答第二个问题,“它实用吗?”:

    在标准头文件中,如 <cmath> .

    <cmath> <math.h> . 这对C用户来说是行不通的,不是吗 < 把所有东西都夹在三明治里 extern "C++" { ... } .

        10
  •  -1
  •   Ferruccio    15 年前

    简单的回答是,您可以使用extern C告诉编译器不要使用名称混乱。这意味着你可以把C和C++代码的位链接到同一个项目中。

        11
  •  -2
  •   Yunnosch    6 年前

    extern "C" void Foo();   // can be called easily from C
    

    至于Exc++“C++”,我从未见过它在真实的代码中,尽管C++标准允许。我想这是不可能的。