首页
社区
课程
招聘
[旧帖] [求助]对typedef和函数指针的一点疑问 0.00雪花
发表于: 2010-2-14 17:02 1482

[旧帖] [求助]对typedef和函数指针的一点疑问 0.00雪花

2010-2-14 17:02
1482
刚才在【求助问答区】与KOEIKOEI讨论函数指针问题时,突然发现自己以前没注意到的一点细节。先看代码:
#include<windows.h>
#include<iostream>
 
using namespace std;
 
typedef int (_stdcall *pMsgBox)(HWND,LPCTSTR,LPCTSTR,UINT);
 
int main()
{
        pMsgBox pf = (pMsgBox)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxA");
 
        cout << MessageBoxA << endl;
        cout << pf << endl;
        cout << (*pf) << endl;
 
        MessageBox(NULL,"Hello","MsgBox",MB_OK);
        pf(NULL,"Hello","MsgBox",MB_OK);
        (*pf)(NULL,"Hello","MsgBox",MB_OK);
 
        return 0;
}


结果pf和(*pf)居然是一样的,而且下面那三种方式都能弹出MessageBox,我想问一下大家一般都怎么写,是写成pf(NULL,"Hello","MsgBox",MB_OK)还是(*pf)(NULL,"Hello","MsgBox",MB_OK)?两者有什么区别么?我反汇编看了一下,两者居然一样的,都是call [ebp-4],好诡异……

攒钱的最后关头,舍不得到【求助问答区】花钱了……在这里发出来,希望大大们不要介意

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不会吧,没分就没人给讲一下了……

S大大,zapline,紧急呼叫……
2010-2-14 17:27
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
快转正了.
1. 问问题不要点点兵
    你点点兵, 兵又不会. 这样我很郁闷.
2010-2-14 18:42
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是不是使用pf指针时是使用里面的值,相当于call eax(eax=0x410000) 这样;使用(*pf)时,根据优先级先取值,相当于 call 0x410000 这样的。然后编译器里面有优化处理,结果就变成一样的了?cout那里肯定是这个原理。
2010-2-14 18:43
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
反汇编之后看,结果两者居然一模一样……都是这样的:
push 0
push xxxxxxxx
push xxxxxxxx
push 0
call   [ebp-4]

但是 pf 和 *pf 怎么可能会一样呢?
2010-2-14 18:58
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
额,大大,sry,我不是点兵,是点将……嘿嘿
大大来了可以给帖子增加亮点,增加人气嘛。
2010-2-14 18:59
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
专业加人气的路过
2010-2-14 19:02
0
雪    币: 485
活跃值: (12)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
8
补充:
你没点的兵来了,他会,这样我更郁闷!

还好我也不会!
2010-2-14 19:07
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
汗。。。
那我以后就都写(*pf)()这种方式好了,这样可以很明显的看出来是使用了函数指针,pf()这样写,别人还以为是函数呢
2010-2-14 19:08
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
额,真不是点兵,是求救啊……就是不想被误会被点兵,所以才没加到标题或者正文里,专门在2L新开了一片地喊救命……结果还是做错了,我有罪
2010-2-14 19:10
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=xiilin;762234]反汇编之后看,结果两者居然一模一样……都是这样的:
push 0
push xxxxxxxx
push xxxxxxxx
push 0
call   [ebp-4]

但是 pf 和 *pf 怎么可能会一样呢?[/QUOTE]

pf 和 *pf 当然不一样了,*是一个运算,但是编译器应该会进行一些优化处理,这里就直接把*的取值运算省略了,他call   [ebp-4],应该是用pf, 如果是call [ebp-4]里面的值应该对应*pf,但是那样可能比较死板吧。 int a=3;#define b 3, int a=b;他们在c层面是不一样的,但是宏替换后就都是int a=3;了。 这里只是在从c到机器码时优化了一下,我猜的。
2010-2-14 20:06
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
哈哈,我终于知道了!!
pf()这种用法是C++的标准用法,(*pf)()是C的用法,为了兼容,在C++里也可以这样用。
但是VC6实在太邪恶了,即使在C文件里,用pf()居然也没报错,连警告都没有……所以在VC6下两者是一样的……
好了,睡觉,哈哈,晚安~

PS:为啥现在打开论坛总是会出现“502 Bad Gateway”,然后必须刷新几次才能打开页面?
2010-2-14 22:16
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我也是刷了好几遍才进得来
2010-2-15 00:15
0
雪    币: 3
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
搞了半天是这样啊。话说我C++没学过。不清楚。
2010-2-15 02:21
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
函数和函数指针么?  并非你说的C用法 C++用法
而且代码是编译通过的么?
#inclde<iostream> 还掉了个U

如果 typedef int (_stdcall *pMsgBox)(HWND,LPCTSTR,LPCTSTR,UINT);

pMsgBox pf 中PF  我在VC6下有类型转换问题
2010-2-15 13:23
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
确实少了个u,已改正,呵呵。
汗。。。类型转换有问题是因为没加强制类型转换,我漏打了……已改正。
看来以后帖代码要直接copy/paste了。
2010-2-15 14:53
0
游客
登录 | 注册 方可回帖
返回
//