通常,要使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"
语句中。为什么是这样?
答案 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 ++,所以它们自己也这样做。