尽管 C++ 语言是C语言的超集,也就是C++会兼容C,但是在使用C++编译器编译的时候,可可能能会出现许多C程序会产生编译器错误。以下的C程序情况就无法在C++编译器中编译:
-
在声明之前调用函数
-
使用带有 const 变量的普通指针
-
使用类型转换的指针
-
声明常量值而不初始化
-
使用特定关键字作为变量名
-
严格的类型检查
-
main() 的返回类型
下面将详细讨论这些要点:
1. 在声明之前调用函数:在 C++ 中,在声明之前调用函数是编译器错误。但在 C 中,它可以编译。(请参阅在 C 中声明函数之前调用函数会发生什么?)
// C Program to demonstrate calling
// a function before declaration
#include <stdio.h>
// Main starts
int main()
{
// fun() is called before its
// declaration/definition
fun();
}
// Function Declaration
int fun()
{
printf("Hello");
return 0;
}
2. 使用带有 const 变量的普通指针:在 C++ 中,当使用普通指针指向 const 变量时会产生编译器错误,但在 C 中是允许的。
// C Program to demonstrate using a
// normal pointer with const variable
#include <stdio.h>
// Main starts
int main()
{
// A normal pointer points to const
int const j = 20;
int* ptr = &j;
// The below assignment is invalid in C++,
// results in error.In C, the compiler may
// throw a warning, but casting is implicitly allowed
printf("*ptr: %d\n", *ptr);
return 0;
}
3. 使用类型转换的指针:在 C 中,void 指针可以直接分配给其他指针,如 int *、char *。但是在 C++ 中,void 指针必须是显式类型转换。
// C Program to demonstrate
// using typecasted pointers
#include <stdio.h>
// Main starts
int main()
{
void* vptr;
// In C++, it must be
// replaced with int *iptr=(int *)vptr;
int* iptr = vptr;
return 0;
}
注意:这是我们在使用 malloc() 时注意到的。malloc() 的返回类型是 void *。在 C++ 中,我们必须将 malloc() 的返回值显式类型转换为适当的类型,例如,“int *p = (int *)malloc(sizeof(int))”。在 C 中,不需要类型转换。
4. 声明常量值而不进行初始化:在 C++ 中,必须初始化 const 变量,但在 C 中则没有必要。以下程序在 C 中编译并运行良好,但在 C++ 中编译失败。
// C Program to demonstrate declaring
// constant values without initializing:
#include <stdio.h>
// Main starts
int main()
{
const int a;
return 0;
}
5. 使用特定的关键字作为变量名:在C语言中,可以使用特定的关键字作为变量名,但在C++中是不可能的。以下程序不会在 C++ 中编译,但会在 C 中编译。
// C Program to demonstrate using
// specific keywords as variable names
#include <stdio.h>
// Main starts
int main(void)
{
// new is a keyword in C++
// but not in C
int new = 5;
printf("%d", new);
}
同样,我们可以使用其他关键字,如delete、explicit、class等。
6. ) 严格的类型检查: C++ 比 C 做更严格的类型检查。例如,下面的程序用 C 编译,但不能用 C++ 编译。在 C++ 中,我们得到编译器错误“从 'int' 到 'char*' 的无效转换”。
// C Program to demonstrate
// strict type checking
#include <stdio.h>
// Main starts
int main()
{
char *c = 333;
printf("c = %u", c);
return 0;
}
7. main() 的返回类型:在 C++ 中,main 函数需要返回类型为 'int',而在 C 中则不然。在 C++ 中,我们不能使用返回类型为 'void'。
// C Program to demonstrate that
// 'void' can be used as a return type
// for main()
#include <stdio.h>
// Main starts
void main()
{
printf("Hello World");
}
8. 下面的程序可以用 C 编译,但不能用 C++ 编译。
// C Program that won't compile in C++
#include <stdio.h>
void func()
{
// definition
}
// Main starts
int main()
{
func();
func(2);
}
说明:在 C++ 中,func() 等价于 func(void),而在 C 中,func() 等价于 func(…)。