首页
社区
课程
招聘
[原创]说说我认识的 typedef
发表于: 2009-2-19 13:03 61318

[原创]说说我认识的 typedef

2009-2-19 13:03
61318
C语言用了那么久了,突然有了一点心得和体会,很想和大家交流一下,但是又怕大牛们笑我 ,今天我就不要脸了,把我对typedef的认识和使用心得说出来和大家一起分享!

      先来温习一下typedef的意义:定义一种类型的别名.

      它的意思简单明了,就是定义一种类型的别名,但是怎么去理解?我自己的理解是把变量定义为一种类型.下面给出实例来解释我的理解.
例一
int integer;定义一个int类型的变量,变量名称是integer.很好理解,再改变为typedef int integer;这下有点不同了,integer不再是一个变量,而是一个类型了,可以用来直接定义,比如integer i,j,k;这是可以的,i,j,k这三个变量的类型就是把integer做为变量看待时的类型,也就是int类型,因为把把integer做为变量看待时,integer是int类型.typedef int integer;integer i,j,k;这两句连起来就是定义了i,j,k三个变量,它们的类型是int.
例二
int (WINAPI * call)(HWND,LPSTR,LPSTR,UINT);定义一个函数指针,指向的函数类型是返回值是int类型,参数是(HWND,LPSTR,LPSTR,UINT),调用形式为 WINAPI 的这样的函数,我们可以把这个指针指向user32.dll里的MessageBoxA这个函数,为什么可以指向这个函数?因为这个API的返回值是int类型的,而且参数也是(HWND,LPSTR,LPSTR,UINT)这几个类型,调用方式也是WINAPI所有的条件都完全符合了,是不是很巧合呀,因为这是我自己构造出来的嘛,当然什么都一样了~~,使用方法为:
int (WINAPI * call)(HWND,LPSTR,LPSTR,UINT);
HMODULE hDll=LoadLibrary("user32.dll");
call=(int(WINAPI * )(HWND,LPSTR,LPSTR,UINT))GetProcAddress(hDll,"MessageBoxA");
FreeLibrary(hDll);
(*call)(NULL,"HI,I AM  FROM USER32.DLL","TEST",MB_OK);
要是有一个函数指针变量的话,我们的工作该多省呀,不要说我懒嘛,每次都写这么长的一串也是很容易出错的嘛,是不是?现在有了typedef,我们解放了,
typedef int (WINAPI * call)(HWND,LPSTR,LPSTR,UINT);
call 原来是一个函数指针变量,现在加了typedef后,call不再是一个变量了,而是一种类型,叫做函数指针类型,指向返回值为int,参数是(HWND,LPSTR,LPSTR,UINT),调用形式为WINAPI的函数的指针类型,我们可以用它来直接定义变量了,则原来的代码可以写为
typedef int (WINAPI * call)(HWND,LPSTR,LPSTR,UINT);
call mycall;//定义一个函数指针变量
HMODULE hDll=LoadLibrary("user32.dll");mycall=(call)GetProcAddress(hDll,"MessageBoxA");
FreeLibrary(hDll);
(*mycall)(NULL,"HI,I AM  FROM USER32.DLL","TEST",MB_OK);

效果和原来的一模一样,只是代码少了一点,但是可读性大大增强了.

先讲到这里,虽然字少,但是把我的手都打麻了........................

[课程]Linux pwn 探索篇!

收藏
免费 7
支持
分享
最新回复 (61)
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
认真仔细的读了一遍,理解了一些,谢谢
2009-2-19 13:07
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
3
多点这样的贴挺好。

“把变量定义成类型”这个说法逻辑上虽然不太准确,但确实反映了实际情况。

编译器进行语法扫描的时候,对typedef定义的类型和对变量的解析确实是一致的。

把声明变量的语句前面加上个typedef,就变成了声明类型。

明白了这点,再看到类似typedef void (*LPVOID),(*PVOID);的语句时,就不会想不明白了。
2009-2-19 22:45
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
4
激励更多的人来写这样的帖子
2009-2-19 22:55
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
新人前来学习,谢谢楼主的帖子!
2009-2-20 15:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哈哈,LZ想精华想的……
看来我等菜菜也得努力,先学会怎么学编程,然后开始动手,俺也跟着LZ学·~~~
写基础的文章,丰富了自己,教会了别人~~~~
2009-4-7 23:14
0
雪    币: 148
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
很好.学习以下.
2009-4-7 23:20
0
雪    币: 1334
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你继续写吧,感觉不错,
给你加个精,鼓励更多的人来写自己的心得体会

论坛精华帖的意义就在于, 激励更多人来一起分享心得, 写的如何先不说,这种分享心得体会的精神就值鼓励,一些对论坛有益的,有参考价值的都应该给予激励,一个精华不算什么,但是因为一个精华帖子改变了一个人一生的学习态度和人生际遇, 这才是看雪论坛一直以来追求的东西
2009-4-7 23:28
0
雪    币: 263
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
向亿万大叔学习
2009-4-8 10:57
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我想起来<C专家编程>里说的:它是什么,被称作什么,实际是什么,人们叫它什么.
2009-4-8 12:15
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了,刚好我现在在看C的typedef...
2009-4-8 19:45
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
哎~我们学C++时,函数指针老考试~~
2009-4-8 21:57
0
雪    币: 16
活跃值: (400)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
温故而知新。。。
2009-4-9 01:00
0
雪    币: 111
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
写得挺好的,尤其是“把变量定义为一种类型”很有创新思维,开始我还准备说你写错了,不过接着看下去发现这么理解也有一定道理,不过变量的值是可以改变的,而且这句话也挺拗口。typedef简单的理解就是给自定义或者已经定义好的类型起一个容易记的名字,比如效力于火箭队的穆托姆博的全名可能连他自己也记不住,如此,我们可以简单的管他叫穆大叔。
2009-4-9 09:03
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
小弟第一次发贴,初次就献给好文了,每次看到MSDN里一大堆typedef之后深感无奈。不知道那些个人是想让人好记还是要让人迷糊。唉~
2009-4-9 13:03
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
见到typedef。。。就迷茫啊!
2009-4-9 19:19
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
可以这样定义吗?
typedef void (WINAPI *PMyFun)();
typedef void (WINAPI *PMyFun)(void);
typedef void (WINAPI *PMyFun)(void,void);
typedef void (WINAPI *PMyFun)(void,void,void);
typedef void (WINAPI *PMyFun)(void,void,void,void);
typedef void (WINAPI *PMyFun)(void,void,void,void,void);
.............
这样是不是可以调用返回值为任意类型,参数有N个的函数?
2009-4-9 19:30
0
雪    币: 155
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
我们老师以前说得好像很简单,就是为了方便程序移植,取个名字而已
2009-4-9 19:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
首先,恭喜一下LZ,终于有精华了,哈哈·~~~
其次,想LZ学习,我也要努力赚精华~~~~
最后,祝大家天天进步,都能修成正果~
2009-4-9 19:51
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
LZ赚到了精华,我们赚到了知识,同喜啊!
2009-4-9 20:00
0
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
  好文!
2009-4-9 20:10
0
雪    币: 398
活跃值: (49)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
我在读C语言时,感觉最难理解的就是 typedef,  以前我也曾偷偷地用你这种思想来理解它!
不过我还是没完全理会以!
2009-4-9 20:37
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
最神奇的是  
typedef int (WINAPI * call)(HWND,LPSTR,LPSTR,UINT);
call mycall;//定义一个函数指针变量
HMODULE hDll=LoadLibrary("user32.dll");mycall=(call)GetProcAddress(hDll,"MessageBoxA");
FreeLibrary(hDll);
(*mycall)(NULL,"HI,I AM  FROM USER32.DLL","TEST",MB_OK);

学校里学的C语言控制台程序就从来没这么讲过,太郁闷了。
2009-5-3 23:07
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
呵呵,以前被这个typedef折腾的几天头都是大的。。。
2009-5-4 07:29
0
雪    币: 339
活跃值: (10)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
25
有意思,不过貌似发了该贴就没有下文了,期待lz更新啊
2009-5-4 08:34
0
游客
登录 | 注册 方可回帖
返回
//