我正在开发一个包含大量遗留C代码的项目。我们已经开始用 C++ 编写,目的是最终也转换遗留代码。我对C和 C++ 的交互方式有点困惑。我知道通过用 C++ 编译器包装C代码extern "C"
不会破坏C代码的名称,但我不完全确定如何实现这一点。
因此,在每个C头文件的顶部(包含保护之后),我们有
#ifdef __cplusplus
extern "C" {
#endif
在底部,我们写
#ifdef __cplusplus
}
#endif
在两者之间,我们拥有所有的包含、类型定义和函数原型。我有几个问题,看看我是否理解正确:
如果我有一个包含C头文件 Bh 的 C++ 文件 A.hh,包含另一个C头文件 Ch,这是如何工作的?我认为当编译器进入 Bh 时,
__cplusplus
将被定义,因此它将用extern "C"
(并且__cplusplus
不会在此块内定义)包装代码。因此,当它进入 Ch 时,__cplusplus
不会被定义,代码也不会被包裹在extern "C"
. 这个对吗?用 包装一段代码有什么问题
extern "C" { extern "C" { .. } }
吗?第二个会extern "C"
做什么?我们不会将此包装器放在 .c 文件周围,而只是 .h 文件。那么,如果一个函数没有原型会发生什么?编译器是否认为它是 C++ 函数?
我们还使用了一些用C编写的第三方代码,并且没有这种包装器。每当我包含该库中的标题时,我都会
extern "C"
在#include 周围添加一个。这是处理这个问题的正确方法吗?最后,这是一个好主意吗?还有什么我们应该做的吗?在可预见的未来,我们将混合C和 C++,我想确保我们覆盖了所有的基础。