21
2020
07

typedef用法

1、宏替换,肯定只能用#define了,比如:#define PI 3.14

2、给简单数据类型起别名:#define uint32 unsigned int  或   typedef unsigned int uint32;其实这两个是一样的。

3、声明一个指向简单数据类型变量的指针,比如我们这样定义  #define uint32_p   unsigned int *  如果我们只用来声明一个指针变量是没问题的,但是要是出现这样一种情况:uint32_p  p1,p2;结果会怎样呢?根据#define替换的功能,可以解析成

unsigned int *p1,p2;而这个声明的作用与我们之前的目的是完全不一样了吧。而如果我们换成了typedef unsigned int * uint32_p;uint32_p,是一种新的数据类型,完全可以用它去声明uint32_p p1,p2;

例子:

定义如下:

#define PCHAR1 char*

typedef char* PCHAR2;

举例说明如下:

PCHAR1 pc1, pc2;

PCHAR2 pc3, pc4;

上面两行语句目的是想把pc1、pc2、pc3、pc4都定义成指向char型数据的指针,结果pc2不符合定义成指针的预期,其实际为char型普通变量,其它三个为指针变量,符合预期。

为什么导致这个结果呢?原因很简单,define就是一个宏定义,在编译预处理阶段直接字符串替换,直接将PCHAR1替换成char*,替换后变成如下形式:

char * pc1, pc2;

很显然,pc1是指针变量,pc2为普通变量。


5.(*(void (*)())0)();我们知道void(*)()这是一个函数指针类型的声明,声明了一个指向返回值类型为void的函数的函数指针,函数指针指向的函数的地址为0地址,最后(*0)();调用内存地址为0的那个函数,假如我们在程序的其它地方也会用到void (*)(),我们是不是考虑一下,用typedef  void (*A)()当我们再要定义返回值类型为void类型的函数指针时只用写:A a;


#include <stdio.h>
int Max(int a,int b){
return a>b?a:b;
}
typedef int(*HANDLER)(int,int);
HANDLER Fun(int a,int b,HANDLER pfun){
printf("Max value=%d\n",pfun(a,b));
return pfun;
}

void main(){
Fun(10,20,Max);
}



« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。