欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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;
}