为什么要使用'extern'C++"'?

Les*_*Les 70 c c++

本文中,关键字extern后面可以跟"C"或"C++".为什么要使用'extern'C++"'?这是实用的吗?

Tho*_*day 103

语言允许:

extern "C" {
  #include "foo.h"
}
Run Code Online (Sandbox Code Playgroud)

如果foo.h包含需要C++链接的东西怎么办?

    void f_plain(const char *);
    extern "C++" void f_fancy(const std::string &);
Run Code Online (Sandbox Code Playgroud)

这就是你如何保持链接器的快乐.

  • 我不理解downvotes.这是一个需要extern C++的用例,它是合法的. (3认同)
  • 它不仅有效,我已经看到它在野外使用(这是我的"啊哈"时刻).看看winnt.h. (3认同)

Jam*_*ran 32

没有真正的理由可以使用extern "C++".它只是明确了隐式默认的链接.如果你有一个类,其中一些成员有外部"C"链接,你可能希望明确说明其他成员是extern"C++".

请注意,C++标准在语法上定义extern "anystring".它只给正规的含义extern "C"extern "C++".编译器供应商可以自由定义extern "Pascal",甚至extern "COM+"可以自己定义.

  • 我希望编译器支持`extern"Haskell"`. (7认同)
  • 当您需要覆盖周围范围中的某些其他链接规范时,可以使用它. (4认同)

jef*_*ffm 19

我不确定你为什么需要这样做,但是根据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
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*itb 6

两个猜测:

  • 如果您在一个extern "C"块中,则可以通过指定嵌套来再次获得C++语言链接extern "C++".
  • 它保留了C++链接,因为它是定义C++的文档.谁能更好地定义C++语言联系而不是自身.它还提供完整性.同样的交易signed/unsigned.

阅读这个解释extern "LanguageName"(即GCC extern "Java")的答案.