也是将C++改写为C时需要注意的一些地方。
1.布尔类型
C++中有原生的布尔类型bool,同时也有true和false关键字。然而C语言中直到C99才引入了布尔类型_Bool,同时还增加了一个头文件stdbool.h,其中定义了bool、true和false,以便与C++兼容。
假如编译器不支持C99的话,可以这样来定义布尔类型:
typedef enum { false, true } bool;
2.结构体
C++中可以在定义结构体的时候对结构体成员进行初始化,例如:
//cpp
struct A_Struct {
int a1 = 0;
float a2 = 1.0;
};
而在C中只能定义结构体,不能对成员进行初始化赋值,上面这段代码是不能编译成功的。
在C++中,如上定义了A_Struct这个结构体之后,创建一个实例可以直接A_Struct A
这样写,而在C中则需要加上struct这个关键字,写成struct A_Struct A
。如果在C中也想如同C++一样创建实例,那么在定义结构体的时候需要typedef
,例如写成:
//c
typedef struct AStruct {
int a1;
float a2;
struct AStruct *ptr;
//A_Struct *ptr; //error!
}A_Struct;
注意这个结构体中的指针成员ptr
的定义,由于定义ptr
的时候A_Struct
实际上还是没有被声明的,所以不能用A_Struct
代替struct AStruct
。
3.函数传参
在C++中可以通过传引用调用call-by-reference来传递函数的参数,然而C中只有传值调用call-by-value。C++中经常被用来解释传引用调用的swap函数,改写为C语言的话就需要用传入地址值(也就是指针)的方式了。
4.空形参表
在C++中,函数参数列表为空时,不必特意指明void,int fun()
和int fun(void)
是相同的,空形参表即void形参。假如调用的时候写成fun(1)
传入了参数,那么编译就会报错了。
而C中,函数参数列表为空时,应该写成int fun(void)
,否则仅表示函数的形参个数和类型不确定,并非没有参数,编译器不会进行类型检查。声明为int fun()
的函数,调用的时候写成fun(1)
是不会报错的。这里给出了一个由于错误传入参数可能导致栈溢出的例子:
#include <stdio.h>
void test()
{
printf("1");
}
struct
{
int arr[1024*1024*10];
} a;
int main()
{
test(a);
return 0;
}