在很大程度上,C++是C的超集,这意味着一个有效的C程序也是一个有效的C++程序。
C和C++的主要区别是,C++支持许多附加特性。但是,C++中有许多规则与C稍有不同。这些不同使得C程序作为C++程序编译时可能以不同的方式运行或根本不能运行。
本节着重讨论这些区别。如果使用C++的编译器编译C程序,就知道这些不同之处。虽然C和C++的区别对本书的示例影响很小,但如果把C代码作为C++程序编译的话,会导致产生错误的消息。
C99标准的发布使得问题更加复杂,因为有些情况下使得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++的异同也在不断变化。
— 01 —
函数原型
在C++中,函数原型必不可少,但是在C中是可选的。这一区别在声明一个函数时让函数名后面的圆括号为空,就可以看出来。在C中,空圆括号说明这是前置原型,但是在C++中则说明该函数没有参数。也就是说,在C++中,intslice();和int slice(void);相同。例如,下面旧风格的代码在C中可以接受,但是在C++中会产生错误:
int slice();
int main()
{
...
slice(20, 50);
...
}
int slice(int a, int b)
{
...
}
在C中,编译器假定用户使用旧风格声明函数。在C++中,编译器假定slice()与slice(void)相同,且未声明slice(int,int)函数。
另外,C++允许用户声明多个同名函数,只要它们的参数列表不同即可。 |