结合C+和C-#ifdef_cplusplus是如何工作的?我正在做一个有很多遗产的项目C密码。我们已经开始用C+编写,目的是最终转换遗留代码。我有点搞不懂C与C+交互。我理解通过包装C代码extern "C"C+编译器不会损坏C代码的名称,但我不完全确定如何实现这一点。所以,在每个C头文件(在包含守卫之后),我们有#ifdef __cplusplusextern "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,而且没有这种包装。每当我从那个库中包含一个标题时,我就会将extern "C"围绕#包括。这是处理这个问题的正确方法吗?最后,这是个好主意吗?我们还有什么要做的吗?我们要混合C和C+在可预见的将来,我想确保我们涵盖了我们所有的基地。
3 回答
翻翻过去那场雪
TA贡献2065条经验 获得超14个赞
extern "C"不改变 __cplusplus宏。它只是更改了包装声明的链接和名称损坏。 你可以筑巢 extern "C"街区相当愉快。 如果您编译 .c文件作为C+,那么任何东西都不是在 extern "C"块,并且没有 extern "C"Prototype将被视为C+函数。如果将它们编译为C,那么一切当然都是C函数。 是 您可以通过这种方式安全地混合C和C+。
拉丁的传说
TA贡献1789条经验 获得超8个赞
- 3 回答
- 0 关注
- 1234 浏览
添加回答
举报
0/150
提交
取消
