C语言 & C++ 标准

C语言标准

  • C89: 1989 年,C语言由美国国家标准协会(ANSI)进行了标准化,这个版本的语言经常被称作”ANSI C”,或有时称为”C89”
  • C99: 在2000年三月,ANSI采纳了ISO/IEC 9899:1999标准。这个标准通常指C99。
    新特性: 包括内联函数(inline functions)、可变长度的数组(variable-length array)、灵活的数组成员(即柔性数组)、复合字面量、指定成员的初始化器、对IEEE754浮点数的改进、支持不定参数个数的宏定义,在数据类型上还增加了 long long int 以及复数类型。
  • C11: 在2011年12月,ANSI采纳了ISO/IEC 9899:2011标准。这个标准通常即C11。
    新特性: 字节对齐说明符(alignas)、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持
  • C18: 在2018年6月,ANSI采纳了ISO/IEC 9899:2018标准,这个标准通常即C18(有时被称为C17),它是C语言的现行标准。

C++标准

  • C++98: C++98是第一个C++标准。它分为两个部分:核心语言和C++标准程序库;后者包含了大部分标准模板库和C标准程序库的稍加修改版本。存在许多不属于标准部分的C++程序库,且使用外部链接,程序库甚至可以用C撰写。
  • C++03:
  • C++11:
  • C++14
  • C++17:

C 和 C++的异同

  • 宏与模板: C++ 的模板在设计之初的一个用途就是用来替换宏定义。模板特性在 C++11 后支持了可变长度的模板参数表,可以用来替代 C 中的可变长度函数并保证类型安全;
  • 泛型:C++使用模板,C语言在C11中也通过_Generic宏支持了泛型;
  • 重载:C++支持重载;
  • 指针与引用: C++ 中你仍然可以使用 C 风格的指针,但是对于变量传递而言,更推荐使用 C++ 的 引用 特性来实现类似的功能。由于引用指向的对象不能为空,因此可以避免一些空地址访问的问题;
  • struct: 在 C 和 C++ 中都有 struct 的概念,C 中的 struct 用来描述一种固定的内存组织结构,而 C++ 中的 struct 就是一种类,它与类唯一的区别就是它的成员和继承行为默认是 public 的,而一般类的默认成员是 private 的;
  • const: const 在 C 中只有限定变量不能修改的功能,而在 C++ 中,由于大量新特性的出现,const 也被赋予的更多用法。C 中的 const 在 C++ 中的继任者是 constexpr;
  • 内存分配: C++ 中新增了 new 和 delete 关键字用来在“自由存储区”上分配空间,这个自由存储区可以是堆也可以是静态存储区,他们是为了配合“类”而出现的。其中 delete[] 还能够直接释放动态数组的内存,非常方便。new 和 delete 关键字会调用类型的构造函数和析构函数,相比 C 中的 malloc()、realloc()、free() 函数,他们对类型有更完善的支持,但是效率不如 C 中的这些函数。

参考

@ref: