extern "C"
来包装C代码,C++编译器不会破坏C代码的名称,但我不太确定如何实现这一点。所以,在每个C头文件的顶部(include guards之后),我们添加了
extern "C"
。#ifdef __cplusplus
extern "C" {
#endif
在底部,我们写下:
#ifdef __cplusplus
}
#endif
在这两者之间,我们有所有的包含文件、typedef和函数原型。我有一些问题,想看看我是否理解正确:
如果我有一个C++文件A.hh,其中包括一个C头文件B.h,又包括另一个C头文件C.h,那么这是如何工作的?我认为当编译器进入B.h时,将定义
__cplusplus
,因此它将用extern "C"
括起代码(并且这个块内部不会定义__cplusplus
)。所以当它进入C.h时,__cplusplus
将不会被定义,并且代码也不会用extern "C"
括起来。这样正确吗?用
extern "C" { extern "C" { .. } }
把一段代码括起来有什么问题吗?第二个extern "C"
会做什么?我们不会在.c文件中放置这个包装器,只放在.h文件中。那么,如果一个函数没有原型,会发生什么?编译器会认为它是一个C++函数吗?
我们还使用了一些第三方的用C编写的代码,并且没有这种包装器。每当我包含该库的标头时,我都会在#include周围放置一个
extern "C"
。这是处理它的正确方法吗?最后,这个设置是一个好主意吗?我们将在可预见的未来混合C和C++,我想确保我们覆盖了所有的基础。