C++与C的一些不同点

也是将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;
}

猜你喜欢

转载自blog.csdn.net/u013213111/article/details/106392667