问C++是C的超集吗?C和C++之间有什么区别?我可以使用C++编译器来编译C代码吗?
答C++是从C派生出来的,并且很大程度上基于C,但是有一些合法的C结构在C++中是不合法的。相反,ANSI C继承了C++的一些特性,包括原型和const,所以这两种语言都不是对方的子集或超集;这两种语言也对一些通用结构的含义进行了不同的定义。
C++中最重要的、在C中没有的特性当然是扩展的结构,被称为类,它与运算符重载一起,使得面向对象编程变得方便。还有一些其他的区别和新的特性:变量可以在块中的任何地方声明;const变量可以是真正的编译时常量;结构体标签被隐式地进行了typedef;&在参数声明中请求传引用;以及new和delete运算符,以及每个对象的构造函数和析构函数,简化了动态数据结构的管理。还有许多与类和面向对象编程相关的机制:继承,friend,虚函数,模板等等。(这个C++特性的列表并不完整;C++程序员会注意到许多遗漏。)
C的一些特性使其不能成为C++的严格子集(也就是说,使C程序不一定被C++编译器接受)包括:main可以被递归调用,字符常量是int类型,不需要原型,并且void *会隐式转换为其他指针类型。另外,C++中每一个不是C关键字的关键字在C中都可以作为一个标识符使用;使用像类和friend作为普通标识符的C程序将被C++编译器拒绝。
尽管存在差异,但许多C程序可以在C++环境中正确编译,并且许多最新的编译器都提供C和C++编译模式。(但是通常将C代码直接编译为C++代码不是一个好主意;这两种语言的区别足够大,通常会得到糟糕的结果。)
额外链接
Bjarne Stroustrup 关于子集/超集问题的回答
Richard Stamp 的一篇文章 列出了一些差异
``Noone Really'' 的一篇文章 列出了更多差异
参考文献:H&S p. xviii, Sec. 1.1.5 p. 6, Sec. 2.8 pp. 36-7, Sec. 4.9 pp. 104-107