编写一个不能在 C++ 中编译的 C 程序
尽管 C++ 旨在与 C 向后兼容,但在使用 C++ 编译器编译时,可能有许多 C 程序会产生编译器错误。以下是无法在 C++ 中编译的 C 程序列表:
- 在声明之前调用函数
- 使用带有 const 变量的普通指针
- 使用类型转换的指针
- 声明常量值而不初始化
- 使用特定关键字作为变量名
- 严格的类型检查
- 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;
}
Note: This is something we notice when we use malloc(). Return type of malloc() is void *. In C++, we must explicitly typecast return value of malloc() to appropriate type, e.g., “int *p = (int *)malloc(sizeof(int))”. In C, typecasting is not necessary.
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(…)。