2015-02-07 82 views
0

所以我现在正在学C(打算学习C++之后),但我遇到了一些困境。避免混合使用C和C++代码的做法或方法

  1. 有人不知不觉地将C和C++混合在一起?
  2. 如何避免混合C和C++?
+4

这甚至意味着什么。 – 2015-02-07 07:09:23

+0

'有人在不知不觉中混合C和C++会有多常见?取决于这个人。 '如何避免C和C++的混合?'又取决于这个人。 – deviantfan 2015-02-07 07:12:18

+1

第一季度答案:从C过渡到C++时非常普遍。 Q2的答案:通过练习,被不好的代码咬了几次,从书本和在线资源中学习。 – 2015-02-07 07:12:29

回答

4

的第一件事将是决定你要学习的语言。在学习C++之前学习C是没有必要的,反之亦然。

彻底地学习你所选择的语言。很少有母语为英语的人将德语与英语混合使用,反之亦然。编程语言也是如此 - 如果您熟悉自己选择的语言,即使它们有相似之处,也不可能将其他语言中的内容混合在一起。而且,随着时间的推移,你会认识方言。

阅读C和C++之间的不兼容性。最初的C++标准明确列出了它与前面的标准C(ANSI C89或ISO C90)之间的所有兼容性。关于不兼容性有很多很好的资源可供免费获得 - 一些专注于C开发人员,一些专注于C++开发人员。

配置您的编译器(或IDE或构建脚本),以便编译器能够检测您选择的语言的偏移。还要将其配置为最大警告级别(几乎没有编译器是以这种方式配置的),并努力使代码从不会触发编译器的最小警告。更好的是,用多个编译器来做到这一点。

如果没有上述步骤,下面的经验法则将会不太有效。毕竟,如果不理解潜在的推理,经验法则就不太有效。

一些经验法则,如果使用C开发,避免使用C++特有的特性。

  • 不要使用运营商新的或删除使用任何标准头
  • 避免没有.H扩展名(例如 ,#include <stdio.h>是C,#include <iostream>是C++。
  • 不要使用例外。
  • 不要使用类,使用结构。
  • 不要在结构中指定成员函数。
  • 不要在结构中使用访问说明符(公共,私有,受保护)
  • 不要重载函数(即不要使用同名的函数但不同的参数列表编写两个或多个函数)。
  • 如果您打算使用bool类型(和值truefalse),那么使用#include <stdbool.h>(C99或更高版本)。
  • 请勿使用模板。
  • 如果某个函数不接受任何参数,则用void参数 列表声明它。例如,表示该功能不需要参数 。
  • 请勿使用名称空间。
  • 请勿使用C++风格演员表(const_cast,reinterpret_cast, dynamic_cast, static_cast)。使用普通的C风格的类型转换(例如 (int *)的东西转换成一个指针为int)

一些经验法则,如果用C++开发,以避免特定于C-功能。

  • 不要使用malloc(),realloc(),calloc()或free()来动态分配内存。
  • 避免使用有.h扩展名(对 例如任何标准的头,#include <stdio.h>是C,#include <iostream>是C++。让显著使用标准库的C++。
  • 如果您打算使用bool型(和值truefalse), #include <stdbool.h>,这是因为booltruefalse是在C++中的关键字,但宏在标准C.
  • 如果一个函数接受任何参数,不要用它声明无效论据 名单。
  • 使用命名空间或函数重载来解决您希望具有指定命名方案的多个函数的情况。
  • 不要使用C风格演员,永远。使用C++风格强制转换const_cast,reinterpret_cast,dynamic_cast, static_cast)。
+0

母语为英语的人将两种语言混合在一起 - 法语 - Summat与诺曼征服 – 2015-02-07 10:08:22

+0

英语本身源自很多语言,Ed。但一位母语为英语的人会将这些事情看作是英语,而不是混合法语,西班牙语,拉丁语或他们所选词汇的任何语言。 – Rob 2015-02-07 10:24:01

+0

我知道 - 只是对你的陈述进行观察。 – 2015-02-07 10:25:20

3

C++在20世纪80年代中期脱离了C,当时它已经获得了大部分熟悉的功能。它继续包含最近C99和C11修订版的功能。 C++与C的交集是一种完全合理且有用的语言。

最近,GCC编译器项目在验证他们成千上万(几百万?)的复杂C代码行真的已经大部分有效的C++后,从C切换到C++。

您可以继续学习C,不要太习惯于复杂的功能或古怪的技巧,只需在需要更加结构化的东西时切换到调用C++编译器。

或者,使用C++编译器一直以来,与-Wall -pedantic选项。有丰富的资源对这样的便携性: