龙空技术网

C 是 C++ 的子集吗?

存量IT项目迁移计划 68

前言:

今天小伙伴们对“c语言是c的子集”大致比较看重,看官们都想要剖析一些“c语言是c的子集”的相关文章。那么小编在网摘上收集了一些对于“c语言是c的子集””的相关内容,希望看官们能喜欢,姐妹们一起来学习一下吧!

严格按照数学上的定义来说,C 不是 C++ 的子集。有些程序在 C 里面是合法的,但在 C++ 里却是不合法的;甚至有些编写代码的方式在 C 和 C++ 中有不同的含义。然而,C++ 支持 C 所支持的全部编程技巧。任何 C 程序都能被 C++ 用基本相同的方法写出来,并且运行效率和空间效率都一样。把数万行 ANSI C 代码转换成 C 风格的 C++ 代码,通常只需要几个小时。因此,C++ 是 ANSI C 的超集程度和 ANSI C 是 K&R C 的超集程度以及 ISO C++ 是 1985 年的 C++ 的超集程度差不多。编写风格好的 C 程序通常会是合法的 C++ 程序。

C/C++ 兼容性问题的一些例子:

int main()

{

double sq2 = sqrt(2); /* 不是 C++:调用了未经声明的函数 */

int s = sizeof('a'); /* 隐蔽的区别:C++ 中是 1,而 C 中却是 sizeof(int) */

}

调用未经声明的函数在 C 里是不良风格,而在 C++ 里是非法的。同样的情况还有,传递参数给一个没有在其声明中列出参数类型的函数:

void f(); /* 没有注明参数类型 */

void g()

{

f(2); /* C 中是不良风格。C++ 中不合法 */

}

C 里面,void* 可以隐式转换为任何指针类型,并且堆空间分配通常是通过 malloc() 进行的,无法检查是否已经分配了足够的内存:

void* malloc(size_t);

void f(int n)

{

int* p = malloc(n*sizeof(char)); /* C++ 中非法。C++ 使用 new 分配堆空间 */

char c;

void* pv = &c;

int* pi = pv; /* 隐式转换 void* 为 int*。C++ 中非法 */

}

请注意,隐式转换 void* 为 int* 引起了潜在的数据对齐错误。请参阅 C++ 中 void* 和 malloc() 的代替品。

把 C 代码转换成 C++ 时,请谨记 C++ 的关键字比 C 多:

int class = 2; /* C 中合法。C++ 中是语法错误 */

int virtual = 3; /* C 中合法。C++ 中是语法错误 */

除了少数例外,如上面所述的例子(以及 C++ 标准和 C++ 程序设计语言第三版附录 B 里详细列举的例子),C++ 是 C 的超集。请注意,“C”在以上段落中指的是经典 C 和 C89。C++ 不是 C99 的后裔;C++ 和 C99 是兄弟。C99 引入了一些新特性,造成 C/C++ 的不兼容性进一步增大。

标签: #c语言是c的子集