从 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 的发布版本时,为啥会出现未解决的外部错误?