【发布时间】:2011-04-16 21:40:42
【问题描述】:
我正在处理一个包含大量遗留 C 代码的项目。我们已经开始用 C++ 编写,目的是最终也转换遗留代码。我对 C 和 C++ 的交互方式有点困惑。我知道通过用extern "C" 包装 C 代码,C++ 编译器不会破坏 C 代码的名称,但我不完全确定如何实现这一点。
所以,在每个 C 头文件的顶部(包含保护之后),我们有
#ifdef __cplusplus
extern "C" {
#endif
在底部,我们写
#ifdef __cplusplus
}
#endif
在两者之间,我们拥有所有的包含、类型定义和函数原型。我有几个问题,看看我是否理解正确:
如果我有一个 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++ 在可预见的未来,我 想确保我们覆盖所有 我们的基地。
【问题讨论】:
-
简洁地说,这是最好的解释:
To ensure that the names declared in that portion of code have C linkage, and thus C++ name mangling is not performed.(我从the link得到它)
标签: c++ c c-preprocessor extern-c