今天看到了网上说C是C++的子集,C++可以兼容C,这是真的吗?
要弄明白这个问题,首先,先简单介绍一下这两个语言
C:C语言是一门面向过程的、抽象化的通用程序设计语言。C语言诞生于美国的贝尔实验室,C语言之所以命名为C,是因为他的前身是B语言,经过多年发展,最终在1972年,正式推出。
C++:C++是一种高级程序设计语言,1979年,本贾尼·斯特劳斯特卢普,对C进行了改良工作,改良后,该语言被正式命名为C++。
以据以上介绍,C++确实是从C改进而来,但是,它真的能和C兼容吗?也就是网上说的
用C语言编写的程序可以不加修改地用于C++
是这样吗?
我来测试一下,下面的6段代码,分别在C和C++中是否可以正常编译、运行。
测试环境:cygwin、gcc 11.2
准备完毕,开始
1.一般函数调用
#include <stdio.h>
int main()
{
AAA();
return 0;
}
int AAA()
{
printf("调用了");
return 0;
}
C编译:虽然产生了警告,但正常编译通过
C++编译:产生编译错误,提示AAA函数没有声明 结论:c++调用函数前,需要函数存在,或者函数需要向前声明,过后再实现,但是C不用,被调用的函数可以在调用函数前后任何地方
2.无形参,但有实参的函数调用
#include <stdio.h>
void aaa()
{
}
int main()
{
aaa();
aaa(1);
return 0;
}
C编译:正常编译通过 C++编译:产生编译错误,提示过多的参数 结论:总结,在 C++ 中,调用一个无参数的函数:fun() 相当于调用 fun(void) ,在C 中,调用无参数函数,fun() 相当于调用fun(…),所以,在C中无参数函数,调用时,是可以传入实参的
3.void指针与其他类型指针之间的转换
#include <stdio.h>
int main()
{
void* voidptr = 0;
char* cptr = voidptr;
return 0;
}
C编译:正常编译通过 C++编译:产生编译错误,提示无效的转换,VOID* 到char* 结论:void指针void*,在C中,void*可以赋值给任意类型的指针,但是在C++中必须要显式转换类型后才可以。如第7行写法,便可以
4.关于const变量和指针
#include <stdio.h>
int main()
{
const int a;
const int b = 1;
int *c = &b;
return 0;
}
C编译:虽然产生了警告,但正常编译通过 C++编译:产生编译错误,变量a提示了,必须要初始化a。变量ab则提示了不能把const int* 转为int* 总结:const变量在c中,是无需赋给初始值的,但是C++中不行,同时,C++中const变量指针,不能复制给非const变量指针,但C中可以
5.入口函数,main
#include <stdio.h>
char* main()
{
}
C编译:正常编译通过 C++编译:产生编译错误,提示要求返回int类型 结论:在C中,main函数,可以返回任何类型,但在C++中必须要返回int类型
6.关于字符长度的区别
#include <stdio.h>
int main()
{
printf("%d", sizeof('c'));
return 0;
}
以上代码在C++中运行结果 以上代码在C中运行结果 结论:在C中,字符将会被当作int类型使用,长度为4,C++中,字符就字符类型,长度为1
总结:C++虽然改造自C,但是二者并非完全兼容,且语法中存在一定差异,上述几点,并非C与C++全部差异
|