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

📅  最后修改于: 2021-05-25 18:44:52             🧑  作者: Mango

尽管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");
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”