尽管C++被设计为与C具有向后兼容性,但是当使用C++编译器进行编译时,可能会有许多C程序会产生编译器错误。以下是其中一些。
1)在C++中,在声明函数之前调用函数是编译器错误。但是在C语言中,它可以编译(请参阅https://www.geeksforgeeks.org/g-fact-95/)
#include
int main()
{
foo(); // foo() is called before its declaration/definition
}
int foo()
{
printf("Hello");
return 0;
}
2)在C++中,使普通指针指向const变量是编译器错误,但在C中是允许的。
#include
int main(void)
{
int const j = 20;
/* The below assignment is invalid in C++, results in error
In C, the compiler *may* throw a warning, but casting is
implicitly allowed */
int *ptr = &j; // A normal pointer points to const
printf("*ptr: %d\n", *ptr);
return 0;
}
3)在C语言中,可以将void指针直接分配给其他一些指针,例如int *,char *。但是在C++中,必须显式地键入void指针。
#include
int main()
{
void *vptr;
int *iptr = vptr; //In C++, it must be replaced with int *iptr=(int *)vptr;
return 0;
}
这是我们使用malloc()时注意到的。 malloc()的返回类型为void *。在C++中,我们必须显式将malloc()的返回值类型转换为适当的类型,例如“ int * p =(int *)malloc(sizeof(int))”。在C语言中,不需要类型转换。
4)以下程序可以在C中编译并正常运行,但是在C++中编译失败。 C++中的const变量必须初始化,但在c中则没有必要。感谢Pravasi Meet提出了这一点。
#include
int main()
{
const int a; // LINE 4
return 0;
}
Line 4 [Error] uninitialized const 'a' [-fpermissive]
5)这是最差的答案,但仍然是有效答案。我们可以使用特定于C++的关键字之一作为变量名。该程序不会在C++中编译,但会在C中编译。
#include
int main(void)
{
int new = 5; // new is a keyword in C++, but not in C
printf("%d", new);
}
同样,我们可以使用其他关键字,例如delete,explicit,class等。
6) C++比C做更严格的类型检查。例如,以下程序在C中编译,但不在C++中编译。在C++中,我们得到编译器错误“从’int’到’char *’的无效转换”。感谢Pravasi Meet添加了这一点。
#include
int main()
{
char *c = 333;
printf("c = %u", c);
return 0;
}
7) C++需要主返回’int’类型
#include
void main()
{
printf("Hello World");
}