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

时间:2019-01-30 12:06:07

标签: c++ c linker

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

2 个答案:

答案 0 :(得分:4)

  

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

仅在不考虑C ++兼容性设计库时。但这是黑客。

  

许多库将在其头文件中包含诸如#ifdef __cplusplus extern "C" { ...之类的代码,以使它们更易于使用C ++代码(例如pthread.h

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

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

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

  

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

当然可以! Follow the money trail

  

为什么不总是需要外部的?

因此,总而言之,仅在头文件的作者没有为您执行此操作时,您才需要自己执行此操作。头文件的作者完成此操作后,您无需这样做。

答案 1 :(得分:1)

  

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

可能是这样。无论如何,<stdio.h>是C ++标准库提供的头文件(从C标准库继承)。与所有标准标头一样,保证没有extern "C"即可工作。

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

  

为什么不总是需要外部的?

仅因为某些头文件已被编写为直接支持C ++,所以它们自己也这样做。