C和C++的区别
参考:C Primer plus 6th
在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。C和C++的主要区别是,C++支持许多附加特性。但是,C++中许多规则与C稍有不同。这些不同使得C程序作为C++程序编译时可能以不同的方式运行或者根本不能运行。
C99标准的发布使得问题更加复杂,因为有些情况使得C更接近C++。例如,C99标准允许在代码中的任意处进行声明,而且可以识别//注释指示符。在其他方面,C99使得其与C++的差异变大。例如,新增了变长数组和关键字restrict。C11缩小了与C++的差异。例如,引进了char16_t类型,新增了关键字_Alignas,新增了alignas宏与C++的关键字匹配。C11仍处于起步阶段,许多编译器开发商甚至都没有完全支持C99。要了解它们之间的区别,需要了解C90,C99,C11之间的区别,还要了解C++11与这些标准之间的区别,以及每个标准与C标准之间的区别。下面主要讨论C99,C11和C++之间的区别。由于C++也在发展,因此,C与C++之间的异同也在不断发展变化。
一. 函数原型
- 在C++中,函数原型是必不可少的,但是在C中是可选的。
- C++允许用户声明多个同名函数,只要参数列表不同即可,这是C++的重载特性。但是在C中这是不可以的。
二. Char常量
- C把char视为int类型,而C++将其视为char类型。
- 在C中,常量’A’被存储在int大小的内存块中,字符编码被存储为一个int类型的值。字符变量在C中占一个内存字节。但是在C++中,字符常量和变量都占用一个字节。
三. Const限定符
- 在C中,全局的const具有外部链接,但是在C++中,具有内部链接。
- 在C++中,可以使用const值来初始化其他const变量,在C中不能这样做。
四. 结构和联合
- 声明一个带标记的结构或联合后,就可以在C++中使用这个标记作为类型名。C中不可以。
- 在C和C++中,都可以嵌套声明结构,在C中可以认识使用这些结构,但在C++中使用内部的结构需要使用一个特殊的符号“::”。
五. 枚举
- C++使用枚举比C更加严格,只能把枚举常量赋值给枚举变量,要把int类型赋值给枚举变量必须要显式强制类型转换,而且也不能递增枚举变量。
- C++中可以把声明的枚举变量作为类型声明其他枚举变量。C中不可以这样做。
六. 指向void的指针
- C和C++都可以把任意类型的指针赋值给指向void的指针。但是C++只由使用显式强制类型转换才能把指向void的指针赋值给其他类型的指针。
- C++可以把派生类的对象地址赋值给基类指针,但是在C中没有相关的特性。
七. 布尔类型
- 在C++中,布尔类型是bool,true和false都是关键字。在C中布尔类型是_Bool,但是要包含stdbool.h才可以使用bool,true和false。
八. 可选拼写
- 在C++中,可以用or代替||,还有一些其他拼写,都是关键字。C中这些可选拼写都被定义为宏,要包含iso646.h才能用。
九. 宽字符支持
- 在C++中,wchar_t是内置类型,而且是关键字。在C中,wchar_t被定义在多个头文件中(stddef.h stdlib.h wchar.h wctype.h)。与此类似,char16_t和char32_t都是C++11的关键字,在C11中被定义在uchar.h中。
十. 复数类型
- C++在complex头文件中提供一个复数类来支持复数类型。C有内置的复数类型,并通过complex.h来支持。这两种方法区别很大,不兼容。
十一. 内联函数
- C99支持了C++的内联函数特性,但是,C99的实现更加灵活。在C++中,内联函数默认是内部链接,在C++中,如果允许一个内联函数多次出现在多个文件中,该函数定义必须相同,而且要使用相同的语言记号。C中没有这个要求。
- C允许混合使用内联定义和外部定义,C++不允许。
C++11中没有的C99/C11特性
- 指定初始化器
- 复合初始化器(Compound initializer)
- 受限指针(Restrict pointer)
- 变长数组
- 伸缩型数组成员
- 带可变数量参数的宏