这里有一个新手犯下的数类一个典型错误。
假设,型学我们想调用这个函数,调用的参GetBinaryType。函数
void sample(){ if (GetBinaryType(TEXT(“explorer.exe”),不仅 ????)) { …}}
请问,这里的传递问号处应该传递什么类型的参数?你可能会说,这事儿不难。正确根据这个函数的数类原型描述,它的型学第二个参数是一个 LPDWORD,所以,调用的参我可以这样传递参数:
void sample(){ if (GetBinaryType(TEXT(“explorer.exe”), (LPDWORD)NULL)) { …}}
如果像上面那个传递参数,则程序会崩溃。好吧,也许我们可以像下面这样传递一个 LPDWORD 参数。
void sample(){ LPDWORD lpdw;if (GetBinaryType(TEXT(“explorer.exe”), lpdw)) { …}}
程序再次崩溃。哦,不对,这里的变量没有初始化,我们将它先初始化再试试。
void sample(){ LPDWORD lpdw = NULL;if (GetBinaryType(TEXT(“explorer.exe”), lpdw)) { …}}
程序依然崩溃。等会,我知道怎么得到一个有效的 LPDWORD,像下面这样。
void sample(){ LPDWORD lpdw = new DWORD;if (GetBinaryType(TEXT(“explorer.exe”), lpdw)) { …}}
终于,代码可以跑起来了。好,我们看下一个问题。
当然,经验丰富的程序员还是会摇头。仅仅因为函数原型说参数是 LPDWORD 并不意味着你必须有一个类型为 LPDWORD 的变量。实际上,你只需要一个类型为 LPDWORD 的表达式。
void sample(){ DWORD dw;if (GetBinaryType(TEXT(“explorer.exe”), &dw)) { …}}
不会吧,就这么简单?为什么我要花功夫讲这个主题呢?
不,我不是想要侮辱你的智商。我试图让你像新手一样思考。有时你会阅读一大块代码并发现一些奇怪的东西,比如上面带有新 DWORD 的代码。当你这样做时(例如,在调试该代码序列中的内存泄漏问题时),不要试图为完成简单任务的看似迂回的方式找到一些深刻的含义。如果你能像新手一样思考,你只会认识到这是一个典型的初学者错误,纠正它,然后继续你的生活。
深刻理解函数调用的机制,需向下探索到汇编代码层级,底层摸透之后,回头再看,便觉得一切都是那么自然。
正所谓:道法自然。
(责任编辑:百科)
华润医药(03320.HK):东阿阿胶年度实现净利4328.93万元 基本每股收益0.07元