C语言和C++的关系十分密切,但是也有许多显著的差异。C++标准起源于早期C标准, 并被设计为与当时的C语言在源代码编写和链接方面很大程度上兼容. 因此,两种语言的开发工具(例如IDE和编译器)通常被集成到单个产品中,程序员可以自己选择编写的是C还是C ++,开发工具通常会根据程序员的选择使用不同的编译器和链接器或不同的库。
即便如此,C并不是C++的子集, 一般的C语言代码不经修改很难被一些严格符合C++标准的C++编译器成功编译;同样,几乎所有的C++代码都无法被C语言编译器编译。 在这篇文章中,我们主要讨论的是它们在公共部分的差异,比如在C语言中合法的代码到了C++中成为了不合法的代码,或一段代码在C和C++中表现出不同的行为。
C++的创始人Bjarne Stroustrup建议 C和C++应该尽可能减小差异,以提高这两种语言的兼容性; 而另一些人则认为C和C++毕竟是两种不同的语言——虽然C++起源于C——因此它们之间的兼容性并不是那么重要。 而ANSI的看法:“我们赞同保持C与C++的最大公共子集原则”,同时“保持它们的差别,使这两种语言继续独立发展”,“......委员会希望C++成为重要的和强有力的语言”。
截止到C++20和C2x,C++不支持部分C语言特性,如变长数组,原生复数支持和restrict
类型修饰符(英语:Type qualifier)。另一方面,与C89相比,C99通过合并C ++功能(例如//
注释,允许声明出现在代码中而不只是在函数头)减少了一些其他不兼容性。
C++较C语言有更严格的类型转换和初始化规则 , 因此一些在C语言里合法的语句在C++里是不合法的。ISO C++附录C.1列出了这些区别。
void *ptr;/*从void *到int *的隐式转换*/int *i = ptr;