何时使用extern "C"的简单解释?

17 浏览
0 Comments

何时使用extern "C"的简单解释?

这个问题的答案已经在这里了

C++ 中 extern \"C\" 有什么效果?

也许我没有理解 C 和 C++ 之间的区别,但是我们何时以及为什么需要使用

extern "C" {

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

我简要地阅读了一下它,并注意到 MSVS 附带的所有 .h 标头文件都将其代码包围在其中。什么样的代码是“C 代码”,而不是“C++ 代码”?我以为 C++ 包括所有的 C 代码?

我猜这不是情况,并且 C++ 是不同的,某些标准的特性/函数存在于一个语言中但不存在于另一个语言中(例如:printf 在 C 中是存在的,而 cout 在 C++ 中是存在的),但是通过 extern \"C\" 声明,C++ 是向后兼容的。这样正确吗?

我的下一个问题取决于第一个问题的答案,但是我仍然在这里问一下:因为使用 C 编写的 MSVS 标头文件都用 extern \"C\" { ... } 包围,那么什么时候您需要在自己的代码中使用它呢?如果您的代码是 C 代码,并且您正在尝试在 C++ 编译器中编译它,那么它不应该有问题,因为您包含的所有标准头文件都已经有了 extern \"C\" 的声明在其中,即使在 C++ 编译器中也是如此吗?

您需要在使用 C++ 编译器编译但链接到已构建的 C 库或其他东西时使用吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

其他的答案都是正确的,但是一个完整的“样板”例子可能会更有帮助。在包含C代码到C和/或C ++项目的规范方法如下:

//
// C_library.h
//
#ifdef __cplusplus
extern "C" {
#endif
//
// ... prototypes for C_library go here ...
//
#ifdef __cplusplus
}
#endif

-

//
// C_library.c
//
#include "C_library.h"
//
// ... implementations for C_library go here ...
//

-

//
// C++_code.cpp
//
#include "C_library.h"
#include "C++_code.h"
//
// ... C++_code implementation here may call C functions in C_library.c ...
//

注意:上述方法也适用于从Objective-C ++调用C代码。

0
0 Comments

在C++中声明一个在C语言中被实现/编译的函数时,需要使用\"extern C\"。使用\"extern C\"告诉编译器/链接器使用C的命名和调用规范,而不是使用C++名称重整和C++调用约定。对于提供的其他库函数,您几乎永远不需要使用\"extern C\",因为编写良好的库已经为它导出到C和C++的公共API中添加了这个内容。如果您编写了一个既要在C中也要在C++中可用的库,那么您将必须有条件地在头文件中添加这个内容。\n\n至于是否所有的C代码都是C++代码...不是的。一个流行的神话是C++是\"C的超集\"。虽然C++努力使自己尽可能与C兼容,但是还存在一些不兼容性。例如,\"bool\"是有效的C++,但不是有效的C,而\"_Bool\"存在于C99中,但在C++中不可用。\n\n至于您是否会需要使用extern \"C\"与系统的\".h\"文件...任何良好设计的实现都会为您提供这些文件,因此您不需要使用它们。但是,为确保它们被提供,您应该包括以\"c\"开头并省略\".h\"的等效头文件。例如,如果包括ctype.h,几乎任何合理的系统都会添加extern \"C\";然而,为了确保具有C++兼容头文件,您应该包括头文件。\n\n您可能还会对C++ FAQ Lite中的\"混合C和C++\"感兴趣。

0