This question already has answers here:
What is the effect of extern “C” in C++?

(15个答案)


6年前关闭。




也许我不了解C和C++之间的区别,但是我们何时以及为什么需要使用
extern "C" {

?显然,它是一个“链接约定”。

我简要阅读了一下,发现MSVS随附的所有.h头文件都将其代码包含在其中。究竟什么类型的代码是“C代码”而不是“C++代码”?我以为C++包含所有C代码?

我猜不是这样,C++是不同的,并且标准特性/功能存在于一个或另一个中,但不是两者都存在(即:printf是C而cout是C++),但是C++向后兼容,尽管外部“C”声明。这样对吗?

我的下一个问题取决于第一个问题的答案,但是无论如何我都会在这里问:由于用C编写的MSVS头文件被外部的“C” {...}包围,因此何时需要使用它自己用自己的代码?如果您的代码是C代码,并且您正在尝试在C++编译器中进行编译,那么它应该不会出现问题,因为您所包含的所有标准h文件在C++编译器中都已经包含了“C”东西了吗?

使用C++编译时是否必须使用此功能,但要链接到已构建的C库或其他内容?

最佳答案

声明在C中实现/编译的函数时,需要在C++中使用extern "C"extern "C"的使用会告诉编译器/链接器使用C命名和调用约定,而不是C++名称修改和C++调用约定否则使用。对于其他库提供的功能,您几乎永远不需要使用extern "C",因为编写良好的库已经在其中包含了导出到C和C++的公共(public)API的功能。但是,如果编写的库要在C和C++中都可用,则必须有条件地将其放在 header 中。

至于所有的C代码是否都是C++代码...不,那是不正确的。众所周知,C++是“C的超集”。尽管C++肯定会尽力与C兼容,但还是有一些incompatibilities。例如,bool是有效的C++,但不是有效的C,而_Bool在C99中存在,但在C++中不可用。

至于是否需要将extern“C”与系统的“.h”文件一起使用....任何设计良好的实现都可以在其中使用它们,因此您无需使用它们。但是,为确保提供它们,您应包括以“c”开头且省略“.h”的等效头文件。例如,如果包含,几乎所有合理的系统都将添加extern“C”;但是,为确保C++兼容的 header ,应改为包含 header 。

您可能也对Mixing C and C++ from the C++ FAQ Lite感兴趣。

关于c++ - 什么时候用简单的单词extern “C”? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2796796/

10-13 08:48