![d1f8cc5d14a4651af7b626ed968da58b.png](https://i-blog.csdnimg.cn/blog_migrate/d432e6ce7b842c5dbe786d8a74955610.jpeg)
尽管C++被设计为与C具有向后兼容性,但是当使用C++编译器进行编译时,可能会有许多C程序会产生编译器错误。以下是其中一些。
1)在C++中,在声明函数之前调用函数是编译器错误。但是在C语言中,它可以编译。
#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", *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中则没有必要。
#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++中,我们收到编译器错误“invalid conversion from ‘int’ to ‘char*'”。
#include int main() { char *c = 333; printf("c = %u", c); return 0; }
7)C++要求main 返回“ int”类型
#include void main() { printf("Hello World"); }