为了账号安全,请及时绑定邮箱和手机立即绑定

结合C+和C-#ifdef_cplusplus是如何工作的?

结合C+和C-#ifdef_cplusplus是如何工作的?

C++
慕盖茨4494581 2019-06-29 14:54:22
结合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个赞

  1. extern "C"不改变__cplusplus宏。它只是更改了包装声明的链接和名称损坏。

  2. 你可以筑巢extern "C"街区相当愉快。

  3. 如果您编译.c文件作为C+,那么任何东西都不是在extern "C"块,并且没有extern "C"Prototype将被视为C+函数。如果将它们编译为C,那么一切当然都是C函数。

  4. 您可以通过这种方式安全地混合C和C+。


查看完整回答
反对 回复 2019-06-29
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

有几个问题是安德鲁·谢兰斯基出色回答的合谋,有些人不同意并不能真正改变编译器读取代码的方式

因为您的函数原型被编译为C,所以不能使用不同的参数重载相同的函数名-这是编译器名称损坏的关键特性之一。它被描述为链接问题,但这并不完全正确-您将从编译器和链接器中获得错误。

如果您尝试使用原型声明的C+特性,例如重载,编译器就会出错。

链接器的错误将在稍后发生,因为如果您找到了链接器的话,您的函数似乎就找不到了。有.外“C”声明和报头的包装器包含在C和C+源的混合中。

阻止人们使用将C编译为C+设置是因为这意味着它们的源代码不再是可移植的。该设置是一个项目设置,因此如果一个.c文件被放到另一个项目中,它将不会被编译为c+。我希望人们花时间将文件后缀重命名为.cpp。


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 1234 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号