C语言基础(六)(检测程序错误宏)(枚举)
程序员文章站
2022-03-23 22:01:02
一、检测程序错误的宏
1、系统自带的宏
__FILE__ //所在文件
__LINE__ //所在行数
2、需要自己定义的宏
#define handle_er...
一、检测程序错误的宏
1、系统自带的宏
__FILE__ //所在文件 __LINE__ //所在行数
2、需要自己定义的宏
#define handle_error(msg) (do{perror(msg); \ exit(EXIT_FAILURE);}while(0))
解释:
perror:检查系统错误的宏.一旦发生了,系统错误就会产生一个错误数字(errno),对应相应的错误字符串。
EXIT_SUCCESS 和 EXIT_FAILURE:C 标准定义了两个值,可以作为exit()的参数,来分别指示是否为成功退出。
exit():传递给的是父进程,或者shell终端。3、linux内核里的两个宏:在驱动应用中很广泛
off_set_of(type, member)计算结构体内元素的偏移量。
将0转换为结构体类型的指针,再指向其成员,将地址转换为数值接收即为偏移量
#define off_set_of(type, member) ((long)&((type*)0->member))
containe_of(ptr, type, member)结构体的首地址,需传入该结构体的成员地址。
将0转换为结构体类型指针,再指向其成员,调用typeof函数得到成员类型并申请一个该类型的指针,赋值为传入的成员地址str;该地址减去偏移量即结构体的首地址
#define container_of(ptr, type, member) \ ({typeof ((type*)0->member) *mystr = ptr ; \ (type *)((long)mystr-off_set_of(type,member));})typeof(),得到参数的类型。参数可以是变量名或者表达式。
int *p, a; typeof(p) p_a = &a; //变量名作参数 typeof(*p_a) b = 23; //表达式作参数
二、枚举
枚举:在实际应用中,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。 枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举元素进行赋值。 枚举元素作为常量,它们是有值的,C 语言在编译时按定义的顺序使它们的值为从零开始,逐个加一。 枚举元素可以被赋值,第n个元素被赋值为q后,第n+1个元素的值为q+1,以此类推(枚举元素的值一般不重复,但可以重复)。 一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值。例如:
a = (enum A)3 // 即a = S4 枚举元素一般都为大写。 定义:
enum A { S1, S2, S3, S4, };
利用枚举,编程实现密码锁功能
#include typedef enum { S1, S2, S3, S4, }S; void main(void) { S a = S1;//声明一个变量的格式,以枚举值赋值 int num=0; while(1) { scanf("%d", &num); switch(a) { case S1: if(num == 4) a = S2; else a = S1; break; case S2: if(num == 2) a = S3; else a = S1; break; case S3: if(num == 9) a = S4; else a = S1; break; } if(a == S4) { printf("开了\n"); return; } } return; }