大家好,欢迎来到IT知识分享网。
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定义的标识符是一个新类型,是一个整体,不可分割的整体。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/16296.html