编写一个不会在C++中编译的C程序

尽管C++被设计为与C具有向后兼容性,但是当使用C++编译器进行编译时,可能会有许多C程序会产生编译器错误。以下是其中一些。

1)在C++中,在声明函数之前调用函数是编译器错误。但是在C语言中,它可以编译。

#include<stdio.h> 
int main() 
{ 
   foo(); // foo() is called before its declaration/definition 
}  
  
int foo() 
{ 
   printf("Hello"); 
   return 0;  
}

2)在C++中,使普通指针指向const变量是编译器错误,但在C中是允许的。

#include <stdio.h> 
  
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 <stdio.h> 
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 <stdio.h> 
int main() 
{ 
    const int a;   // LINE 4 
    return 0; 
}
Line 4 [Error] uninitialized const 'a' [-fpermissive]

5)我们可以使用特定于C++的关键字之一作为变量名。该程序不会在C++中进行编译,但会在C中进行编译。

#include <stdio.h> 
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 <stdio.h> 
int main() 
{ 
    char *c = 333; 
    printf("c = %u", c); 
    return 0; 
} 

7)C++要求main 返回“ int”类型

#include <stdio.h> 
void main() 
{ 
    printf("Hello World"); 
} 

六一编程网

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Next Post

C和C++中的未定义行为

周三 3月 25 , 2020
考虑下面的C/C++程序,并尝试猜测输出? 以上所有程序的输出都是不可预测的(或不确定的)。编译器( […]
人工智能与少儿编程的关系密切