调用函数不仅仅只是传递正确的参数类型,你学会了吗?

开发 前端
经验丰富的程序员还是会摇头。仅仅因为函数原型说参数是 LPDWORD 并不意味着你必须有一个类型为 LPDWORD 的变量。实际上,你只需要一个类型为 LPDWORD 的表达式。

这里有一个新手犯下的一个典型错误。
假设,我们想调用这个函数,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 的代码。当你这样做时(例如,在调试该代码序列中的内存泄漏问题时),不要试图为完成简单任务的看似迂回的方式找到一些深刻的含义。如果你能像新手一样思考,你只会认识到这是一个典型的初学者错误,纠正它,然后继续你的生活。

总结

深刻理解函数调用的机制,需向下探索到汇编代码层级,底层摸透之后,回头再看,便觉得一切都是那么自然。
正所谓:道法自然。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2019-03-01 10:42:10

折叠手机iPhone智能手机

2010-03-03 14:42:54

ASP.NET MVC

2016-05-13 19:05:24

2017-09-28 17:20:17

荣之联DataZoohadoop

2013-08-21 10:04:32

大数据Gartner

2009-11-28 20:08:20

谷歌ChromeWeb应用

2018-07-06 15:07:17

2023-11-29 07:23:04

参数springboto

2023-11-08 10:12:40

架构函数元素

2023-06-15 14:10:00

kubeletCNI插件

2022-11-03 08:16:33

MySQL·窗口函数

2024-02-02 11:03:11

React数据Ref

2023-08-01 12:51:18

WebGPT机器学习模型

2024-01-02 12:05:26

Java并发编程

2010-03-23 10:59:14

2023-03-30 07:55:02

2022-12-06 08:37:43

2015-05-14 14:17:28

拿工资写代码

2023-05-05 06:54:07

MySQL数据查询

2022-06-16 07:50:35

数据结构链表
点赞
收藏

51CTO技术栈公众号