这种语言允许:
extern "C" {
#include "foo.h"
}
如果foo.h包含一些需要C++链接的内容,会怎样?
void f_plain(const char *);
extern "C++" void f_fancy(const std::string &);
这就是保持链接器高兴的方法。
使用 extern "C++"
没有实际的理由。它仅仅显式地表明了隐含默认的连接性。如果你有一个类,其中一些成员具有 extern "C"
的连接性,你可能希望明确指出其他成员是 extern "C++"
。
请注意,C++ 标准定义了语法上的 extern "anystring"
。它只为 extern "C"
和 extern "C++"
给出正式的含义。如果编译器供应商喜欢,他们可以自由定义 extern "Pascal"
或甚至 extern "COM+"
。
extern "Haskell"
。 - user142019我不确定你为什么需要这样做,但根据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"
)。
许多人都解释了 extern "C"。在C函数中调用C++库函数时,使用 extern "C++"。相关的子用例是在将C++库与带有主函数的C源代码链接时。请参阅维基页面获取更多详细信息:
C和C++使用不同的名称修饰规则。基本上,extern "C"告诉C++编译器将函数命名为C语言方式。
这个指定使用哪种链接约定。大多数语言都知道如何使用“C”风格函数进行链接。
您需要在以下两种情况下使用:
示例:
// declared in function.h
void f1(void);
你的 C 代码 - 实际上其他编程语言也能链接到 C 函数 - 将无法链接到它,因为目标表中的名称将使用 C++ 命名规则。
如果你写下:
extern "C" void f1(void);
现在链接起来是因为它使用了C约定。
我使用extern "C"的主要原因是为了避免C++的名称修饰规则。如果你在一个.Net语言中工作,并想要PInvoke到特定的本地函数,这非常重要。唯一的方法是禁用名称修饰。
回答第二个问题,“它是否实用?”:
在标准头文件中,如<cmath>
,它是实用的,也是几乎不可避免的。
想象一个仅包含头文件的库X.h,用一种C++和C的常见子集编写,并旨在从两种语言中使用。为了使C++用户受益,X.h包括<cmath>
而不是<math.h>
。但这对于C用户来说是行不通的,如果<cmath>
的作者没有把所有内容夹在extern "C++" {
... }
中。