从C++链接到 C 库:为什么并不总是需要 extern?

Linking to C libraries from C++: why isn't extern always needed?

本文关键字:extern 为什么 链接 C++      更新时间:2023-10-16

通常要让C库在C++中工作,必须将其包含在extern "C" { #include <clibrary.h> }中。许多库将在其头文件中包含类似#ifdef __cplusplus extern "C" { ...的代码,以使它们对C++代码(例如pthread.h)更加友好。有时情况并非如此。例如,stdio.h没有这样的#ifdef,但我仍然可以编译&使用C++编译器链接常用的#include <stdio.h> int main() {printf("Hello");},而不将其封装在extern "C"语句中。为什么会这样?

通常要让一个C库在C++中工作,必须将其包含在extern "C" { #include <clibrary.h> }中。

只有在设计库时没有考虑到C++兼容性。但这是一个黑客。

许多库将在其头文件中包含类似#ifdef __cplusplus extern "C" { ...的代码,以使它们对C++代码(例如pthread.h)更友好

是的,一个好的库可以做到这一点。

因此,您不需要也不应该在#include周围添加另一个extern "C"

stdio.h是一个将正确执行此操作的标头示例(见下文)。

例如,stdio.h没有这样的#ifdef

当然可以!跟随金钱轨迹…

为什么不总是需要extern?

所以,总之,只有当头文件的作者没有为你做这件事时,你才需要自己做。当头文件的作者这样做时,你不需要这样做。

例如,stdio.h没有这样的#ifdef

可能是这样。无论如何,<stdio.h>是由C++标准库(继承自C标准库)提供的头。它保证在没有extern "C"的情况下工作,就像所有标准标头一样。

请注意,在当前版本的标准中,不赞成在C++中使用继承的标准标头的<name.h>名称而不是<cname>,并且已被确定为在未来的修订中删除的候选名称。

为什么不总是需要extern?

这只是因为有些头文件是直接为支持C++而编写的,所以它们自己也支持C++。