当前位置: 移动技术网 > IT编程>开发语言>C/C++ > C语言基础(六)(检测程序错误宏)(枚举)

C语言基础(六)(检测程序错误宏)(枚举)

2017年12月30日  | 移动技术网IT编程  | 我要评论

达人秀第三季总决赛,丹东网站,揭晓兮

一、检测程序错误的宏

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网