何时使用简单的 extern "C" ? [复制]

2024-01-28

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

extern "C" {

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

我简要地阅读了它,并注意到 MSVS 中包含的所有 .h 头文件都用它包围了它们的代码。到底什么类型的代码是“C 代码”而不是“C++ 代码”?我以为C++包含了所有C代码?

我猜测情况并非如此,C++ 是不同的,标准特性/函数存在于其中一个或另一个中,但不是两者都存在(即:printf 是 C,cout 是 C++),但 C++ 是向后兼容的,尽管外部“C”声明。它是否正确?

我的下一个问题取决于第一个问题的答案,但无论如何我都会在这里问:由于用 C 编写的 MSVS 头文件被 extern "C" { ... } 包围,所以什么时候你需要使用这个你自己在你自己的代码中?如果您的代码是 C 代码,并且您尝试在 C++ 编译器中编译它,那么它是否应该毫无问题地工作,因为您包含的所有标准 h 文件都已经在 C++ 编译器中包含了 extern“C” 内容?

在 C++ 中编译但链接到已构建的 C 库或其他内容时是否必须使用它?


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

至于是否所有 C 代码都是 C++ 代码……不,这是不正确的。 C++ 是“C 的超集”是一个流行的神话。虽然 C++ 确实努力与 C 尽可能兼容,但也存在一些问题不兼容 http://david.tribble.com/text/cdiffs.htm。例如,bool是有效的 C++ 但不是有效的 C,而_BoolC99 中存在,但 C++ 中不可用。

至于您是否需要将 extern“C” 与系统的“.h”文件一起使用......任何精心设计的实现都会为您提供这些,因此您不需要使用它们。但是,为了确保提供它们,您应该包含以“c”开头并省略“.h”的等效头文件。例如,如果包含 ,几乎任何合理的系统都会添加 extern“C”;但是,为了确保 C++ 兼容的标头,您应该包含标头

您也可能对。。。有兴趣C++ FAQ Lite 中的混合 C 和 C++ https://isocpp.org/wiki/faq/mixing-c-and-cpp.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时使用简单的 extern "C" ? [复制] 的相关文章

随机推荐