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

📅  最后修改于: 2022-05-13 01:55:25.714000             🧑  作者: Mango

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

尽管 C++ 旨在与 C 向后兼容,但在使用 C++ 编译器编译时,可能有许多 C 程序会产生编译器错误。以下是无法在 C++ 中编译的 C 程序列表:

  1. 在声明之前调用函数
  2. 使用带有 const 变量的普通指针
  3. 使用类型转换的指针
  4. 声明常量值而不初始化
  5. 使用特定关键字作为变量名
  6. 严格的类型检查
  7. main() 的返回类型

下面将详细讨论这些要点:

1)在声明之前调用函数:在 C++ 中,在声明之前调用函数是编译器错误。但在 C 中,它可以编译。 (请参阅在 C 中声明函数之前调用函数会发生什么?)

C
// C Program to demonstrate calling
// a function before declaration
#include 
  
// Main starts
int main()
{
    // fun() is called before its
    // declaration/definition
    fun();
}
  
// Function Declaration
int fun()
{
    printf("Hello");
    return 0;
}


C
// C Program to demonstrate using a
// normal pointer with const variable
#include 
  
// 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;
}


C
// C Program to demonstrate
// using typecasted pointers
#include 
  
// Main starts
int main()
{
    void* vptr;
  
    // In C++, it must be
    // replaced with int *iptr=(int *)vptr;
    int* iptr = vptr;
  
    return 0;
}


C
// C Program to demonstrate declaring
// constant values without initializing:
#include 
  
// Main starts
int main()
{
    const int a;   
    return 0;
}


C
// C Program to demonstrate using
// specific keywords as variable names
#include 
  
// Main starts
int main(void)
{
  
    // new is a keyword in C++
    // but not in C
    int new = 5;
  
    printf("%d", new);
}


C
// C Program to demonstrate
// strict type checking
#include 
  
// Main starts
int main()
{
    char *c = 333;
    printf("c = %u", c);
    return 0;
}


C
// C Program to demonstrate that
// 'void' can be used as a return type
// for main()
#include 
  
// Main starts
void main()
{
    printf("Hello World");
}


C
// C Program that won't compile in C++
#include 
void func()
{
    // definition
}
  
// Main starts
int main()
{
    func();
    func(2);
}


2) 使用带有 const 变量的普通指针:在 C++ 中,当使用普通指针指向 const 变量时会产生编译器错误,但在 C 中是允许的。(必读 - C 中的 Const 限定符)

C

// C Program to demonstrate using a
// normal pointer with const variable
#include 
  
// 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

// C Program to demonstrate
// using typecasted pointers
#include 
  
// Main starts
int main()
{
    void* vptr;
  
    // In C++, it must be
    // replaced with int *iptr=(int *)vptr;
    int* iptr = vptr;
  
    return 0;
}

4) 声明常量值而不进行初始化:在 C++ 中,必须初始化 const 变量,但在 C 中则没有必要。以下程序在 C 中编译并运行良好,但在 C++ 中编译失败。

C

// C Program to demonstrate declaring
// constant values without initializing:
#include 
  
// Main starts
int main()
{
    const int a;   
    return 0;
}

5)使用特定的关键字作为变量名:在C语言中,可以使用特定的关键字作为变量名,但在C++中是不可能的。以下程序不会在 C++ 中编译,但会在 C 中编译。

C

// C Program to demonstrate using
// specific keywords as variable names
#include 
  
// 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

// C Program to demonstrate
// strict type checking
#include 
  
// Main starts
int main()
{
    char *c = 333;
    printf("c = %u", c);
    return 0;
}

7) main() 的返回类型:在 C++ 中,main函数需要返回类型为 'int',而在 C 中则不然。在 C++ 中,我们不能使用返回类型为 'void'。

C

// C Program to demonstrate that
// 'void' can be used as a return type
// for main()
#include 
  
// Main starts
void main()
{
    printf("Hello World");
}

8)下面的程序可以用 C 编译,但不能用 C++ 编译。 (有关更多参考,请参阅本文。)

C

// C Program that won't compile in C++
#include 
void func()
{
    // definition
}
  
// Main starts
int main()
{
    func();
    func(2);
}

说明:在 C++ 中,func() 等价于 func(void),而在 C 中,func() 等价于 func(…)。