typedef关键字

        typedef是C语言的一个关键字,我们实际使用的时候可以理解成是一个绑定器,把若干标识符绑定在一起形成一个新类型,它是给编译器看的,编译器看到这个就直接将其当做一个新的类型看待了。当然了,如果有些人写的编译器并不是这么看待的,那就只能说明他对于C语言标准还没有彻底整明白。

1. typedef unsigned char u8;    //u8就代表unsigned char类型了

举例:

u8  var1;//定义了一个名为var1的unsigned char型变量。

 

2. typedef unsigned int u16;     //u16就代表unsigned int类型了

举例:

u16  var1;//定义了一个名为var1的unsigned int型变量。

 

3. typedef与define是不同的,因为typedef是给编译器看的,而define是给预编译器看的,编译器遇到typedef时就会按照一个新类型来处理一件事,而预编译器遇到define时仅仅只是替换。

#define u8Ptr  unsigned char *    //这里在预编译器眼里u8Ptr仅仅只是为了编程方便临时文本替换成unsigned char *

举例:u8Ptr p1,p2;  //此时p1是指针类型变量,而p2是unsigned char型变量,这里足以数码u8Ptr仅仅只是文本替换。

思考:如果上面写成 #define U8PTR (unsigned char *)的形式,结果会怎么样?

typedef unsigned char *  u8Ptr;  //u8Ptr就代表unsigned char *了,编译器把u8Ptr当做一个新类型,它就是unsigned char *

举例:u8Ptr p1,p2;  //此时p1和p2都是指针变量,因此这足以说明u8Ptr是一个新类型,至少在编译器眼里就是这样的。

 

4. 思考下面代码是否有问题:

typedef char * PSTR;

char string[2] = "xy";

const char * ptr1=string;

const PSTR ptr2=string;//相当于char * const ptr2;

ptr1++;

(*ptr1)++;

ptr2++;

(*ptr2)++;

【解析】const在修饰变量的时候,离谁越近就对谁起作用,因此,对于const char * ptr1来说,const离(*ptr1)较近,离ptr1较远,因此它只对(*ptr1)起作用,对ptr1不起作用,所以ptr1++是没问题的,而(*ptr1)++;则是错误的。而PSTR属于一个新类型,因此对于const PSTR ptr2来说,const显然是离ptr2更近,所以是对ptr2起作用对(*ptr2)不起作用,所以,ptr2初始化一次之后就不能变了,于是ptr2++是错误的,而(*ptr2)++是正确的。

 

5. typedef struct atom_tcb

{

    POINTER sp_save_ptr;

    uint8_t priority;

    void (*entry_point)(uint32_t);

    uint32_t entry_param;

    struct atom_tcb *prev_tcb;

    struct atom_tcb *next_tcb;

    uint8_t suspended;

    uint8_t suspend_wake_status;

    ATOM_TIMER *suspend_timo_cb;

#ifdef ATOM_STACK_CHECKING

    POINTER stack_top;            /* Pointer to top of stack allocation */

    uint32_t stack_size;          /* Size of stack allocation in bytes */

#endif

} ATOM_TCB;//定义了一个名为ATOM_TCB的结构体类型

【总结】用typedef定义的标识符是一个新类型,是一个整体,不可分割的整体。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值