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

Posted

技术标签:

【中文标题】从 C++ 链接到 C 库:为啥不总是需要 extern?【英文标题】:Linking to C libraries from C++: why isn't extern always needed?从 C++ 链接到 C 库:为什么不总是需要 extern? 【发布时间】:2019-01-30 12:06:07 【问题描述】:

通常要让 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" 语句中。为什么是这样?

【问题讨论】:

1.因为您应该在 C++ 中使用 cstdio。 2. 不,99% 的 stdio.h 在这个 macro 中有 extern "C" @KamilCuk stdio.h vs cstdio 与此完全无关。 感谢大家的回答。我应该更仔细地看;我只是 grepped stdio.h 寻找 cplusplus 没有深入挖掘。 【参考方案1】:

通常要让 C 库在 C++ 中运行,您必须将其包含在 extern "C" #include <clibrary.h> 中。

仅当库在设计时未考虑 C++ 兼容性。但这是一个 hack。

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

是的,一个好的图书馆会做到这一点。

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

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

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

当然可以! Followthemoneytrail…

为什么不总是需要 extern?

因此,总而言之,您只需要在头文件的作者没有为您执行此操作时自己执行此操作。头文件作者做的时候,你不需要做。

【讨论】:

【参考方案2】:

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

它可能会。不管怎样,<stdio.h> 是 C++ 标准库(继承自 C 标准库)提供的一个头文件。它保证在没有extern "C" 的情况下也能像所有标准头一样工作。

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

为什么不总是需要 extern?

只是因为有些头文件被写成直接支持C++,所以自己做。

【讨论】:

以上是关于从 C++ 链接到 C 库:为啥不总是需要 extern?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C 程序会在运行时针对 C++ 库编译和链接 C 编译器然后 SIGILL?

为啥我可以链接两个库在 VC 中导出相同的 C-Function?

装Kingbase ES V7时为啥依赖检测时,总是提示我说Microsoft Visual C++ 2008未通过检测???

使用 Numpy 将 Python 库静态链接到 C (C++)

当我想在 C++ Builder Starter 中链接静态库 TinyXML 2 的发布版本时,为啥会出现未解决的外部错误?

为啥从微信打开百度贴吧链接总是自动跳转到这个下载贴吧页面