C++真的能兼容C吗?

今天看到了网上说C是C++的子集,C++可以兼容C,这是真的吗?

要弄明白这个问题,首先,先简单介绍一下这两个语言
C++真的能兼容C吗?_第1张图片

C:C语言是一门面向过程的、抽象化的通用程序设计语言。C语言诞生于美国的贝尔实验室,C语言之所以命名为C,是因为他的前身是B语言,经过多年发展,最终在1972年,正式推出。

C++:C++是一种高级程序设计语言,1979年,本贾尼·斯特劳斯特卢普,对C进行了改良工作,改良后,该语言被正式命名为C++。

以据以上介绍,C++确实是从C改进而来,但是,它真的能和C兼容吗?也就是网上说的

用C语言编写的程序可以不加修改地用于C++

是这样吗?

我来测试一下,下面的6段代码,分别在C和C++中是否可以正常编译、运行。

测试环境:cygwin、gcc 11.2

准备完毕,开始

C++真的能兼容C吗?_第2张图片

1.一般函数调用

#include 
int main()
{
    AAA();
    return 0;
}
int AAA()
{
    printf("调用了");
    return 0;
}

C编译:虽然产生了警告,但正常编译通过
C++真的能兼容C吗?_第3张图片

C++编译:产生编译错误,提示AAA函数没有声明
C++真的能兼容C吗?_第4张图片
结论:c++调用函数前,需要函数存在,或者函数需要向前声明,过后再实现,但是C不用,被调用的函数可以在调用函数前后任何地方

2.无形参,但有实参的函数调用

#include 
void aaa()
{

}
int main()
{
  aaa();
  aaa(1);
  return 0;
}

C编译:正常编译通过
在这里插入图片描述
C++编译:产生编译错误,提示过多的参数在这里插入图片描述
结论:总结,在 C++ 中,调用一个无参数的函数:fun() 相当于调用 fun(void) ,在C 中,调用无参数函数,fun() 相当于调用fun(…),所以,在C中无参数函数,调用时,是可以传入实参的

3.void指针与其他类型指针之间的转换

#include 
int main()
{
    void* voidptr = 0;
    char* cptr = voidptr;
    //下面两行代码,C++中可以编译
    //char* cptr = (char*)voidptr;
    return 0;
}

C编译:正常编译通过
在这里插入图片描述
C++编译:产生编译错误,提示无效的转换,VOID* 到char*
C++真的能兼容C吗?_第5张图片
结论:void指针void*,在C中,void*可以赋值给任意类型的指针,但是在C++中必须要显式转换类型后才可以。如第7行写法,便可以

4.关于const变量和指针

#include 
int main()
{
  const int a;
  const int b = 1;
  int *c = &b;
  //以下代码C++可以正常编译
  //const int d =1;
  //const int *e = &d;
    return 0;
}

C编译:虽然产生了警告,但正常编译通过
C++真的能兼容C吗?_第6张图片
C++编译:产生编译错误,变量a提示了,必须要初始化a。变量ab则提示了不能把const int* 转为int*
C++真的能兼容C吗?_第7张图片
总结:const变量在c中,是无需赋给初始值的,但是C++中不行,同时,C++中const变量指针,不能复制给非const变量指针,但C中可以

5.入口函数,main

#include 
char* main()
{
  
}

C编译:正常编译通过
在这里插入图片描述
C++编译:产生编译错误,提示要求返回int类型
C++真的能兼容C吗?_第8张图片
结论:在C中,main函数,可以返回任何类型,但在C++中必须要返回int类型

6.关于字符长度的区别

#include 
int main()
{
  printf("%d", sizeof('c'));
  return 0;
}

以上代码在C++中运行结果
在这里插入图片描述
以上代码在C中运行结果
在这里插入图片描述
结论:在C中,字符将会被当作int类型使用,长度为4,C++中,字符就字符类型,长度为1


总结:C++虽然改造自C,但是二者并非完全兼容,且语法中存在一定差异,上述几点,并非C与C++全部差异

C++真的能兼容C吗?_第9张图片

你可能感兴趣的:(C++,c++,c语言)