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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值