c++ - 避免C和C++代码混用的做法或方法

标签 c++ c

<分区>

所以我目前正在学习C(计划之后学习C++)但是我遇到了一些困境。

  1. 在不知不觉中混用 C 和 C++ 的情况有多普遍?
  2. 如何避免混合使用 C 和 C++?

最佳答案

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

彻底学习您选择的语言。很少有以英语为母语的人会把德语和英语混在一起,反之亦然。编程语言也是如此——如果你很了解你选择的语言,你就不太可能将其他语言的东西混在一起,即使它们有相似之处。而且,随着时间的推移,您将能够识别方言。

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

配置您的编译器(或 IDE,或构建脚本),以便编译器检测您选择的语言的偏移。还将其配置为最大警告级别(实际上没有编译器是开箱即用的这种配置方式)并努力让代码永远不会触发编译器的最小警告。更好的是,使用多个编译器执行此操作。

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

一些经验法则,如果用 C 开发,应避免使用 C++ 特定的功能。

  • 不要使用运算符 new 或 delete
  • 避免使用任何没有 .h 扩展名的标准 header (例如 例如,#include <stdio.h>是 C,#include <iostream>是 C++。
  • 不要使用异常(exception)。
  • 不要使用类,使用结构。
  • 不要在结构中指定成员函数。
  • 不要在结构中使用访问说明符(public、private、protected)
  • 不要重载函数(即不要用 相同的名称,但参数列表不同)。
  • 如果您打算使用 bool输入(和值 truefalse ),然后是 #include <stdbool.h> (C99 或更高版本)。
  • 不要使用模板。
  • 如果一个函数不接受任何参数,用一个空参数声明它 列表。例如,int func(void)意味着函数不需要 论点。
  • 不要使用命名空间。
  • 不要使用 C++ 风格的强制转换(const_castreinterpret_castdynamic_cast , static_cast ).使用普通的 C 风格转换(例如 (int *)将某些东西转换成指向 int 的指针)

一些经验法则,如果用 C++ 开发,可以避免特定于 C 的特性。

  • 不要使用 malloc()、realloc()、calloc() 或 free() 来动态分配内存。
  • 避免使用任何具有 .h 扩展名的标准 header (例如 例如,#include <stdio.h>是 C,#include <iostream>是C++。充分利用 C++ 标准库。
  • 如果您打算使用 bool类型(和值 truefalse ), 不要 #include <stdbool.h> .这是因为 bool , true , 和 false在 C++ 中是关键字,但在标准 C 中是宏。
  • 如果一个函数不接受参数,不要用空参数声明它 列表。
  • 使用命名空间或函数重载来解决您希望拥有多个具有指定命名方案的函数的情况。
  • 永远不要使用 C 风格的转换。使用 C++ 风格转换 const_cast , reinterpret_cast , dynamic_cast , static_cast ).

关于c++ - 避免C和C++代码混用的做法或方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28379581/

相关文章:

c++ - 用 c++11 等价物替换 boost::thread 和 boost::mutex 是否明智?

c++ - 静态函数强制单例模式?

c - (libwebsocket) 如何在客户端连接上发送数据包

c - 除非存在另一个 printf,否则 Printf 不起作用

c - 以下 strtok() 用法有什么问题?

c - 在 C 中访问二维数组的元素

c++ - 预编译 header 和 Visual Studio

c++ - 如何遍历 boost::variant<std::vector<int>, std::vector<String>>?

c++ - 使用 LAPACK 访问子矩阵

c - 未能释放字符指针内存 c