关于VC++6.0的函数的小问题
大家好,我想问下各位高人,vc的函数都有什么区别,为什么有的函数需要在前面写些类型等,有的却不用。例如SetWindowsHookEx(WH_KEYBOARD,//hoo...
大家好,我想问下各位高人,vc的函数都有什么区别,为什么有的函数需要在前面写些类型等,有的却不用。例如
SetWindowsHookEx(
WH_KEYBOARD, // hook type
KeyboardProc, // hook procedure
NULL, // handle to application instance
GetCurrentThreadId() // thread identifier
);
KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);
函数SetWindowsHookEx前面什么也不用写,而函数KeyboardProc前面应该有的LRESULT CALLBACK被删掉后就报错了?
请不吝赐教!
差不多明白了 不过为什么分这么清楚 ,把所有函数都变为API函数不是很方便吗? 展开
SetWindowsHookEx(
WH_KEYBOARD, // hook type
KeyboardProc, // hook procedure
NULL, // handle to application instance
GetCurrentThreadId() // thread identifier
);
KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);
函数SetWindowsHookEx前面什么也不用写,而函数KeyboardProc前面应该有的LRESULT CALLBACK被删掉后就报错了?
请不吝赐教!
差不多明白了 不过为什么分这么清楚 ,把所有函数都变为API函数不是很方便吗? 展开
3个回答
展开全部
楼上两位已经说得很明白了。首先函数声明和函数调用是不一样的。
函数声明,比如:
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
结构是:返回值 函数名(参数1类型 参数1名称, 参数2类型 参数2名称, ..., 参数N类型 参数N名称);
函数调用之前必须要先声明。或者函数调用在函数体之后,则可以不用声明。
函数调用结构:
函数名(实际参数1, 实际参数2, ..., 实际参数N);
返回值 = 函数名(实际参数1, 实际参数2, ..., 实际参数N);
即函数声明中的参数是形式参数,只是个名字和类型。调用的时候,将把实际的参数传入。SetWindowsHookEx 已经在头文件中声明过了,你那样写是函数调用不是声明。
至于你说的 "把所有函数都变为API函数不是很方便吗" 根本就是不可能的。操作系统提供这些函数是为了你编程方便,但是实际上编程不可能只调用系统的函数,用户写自己函数是绝对不可避免的。C/C++ 编程就是由函数组成,他至少包含一个 WinMain(VC)函数,还有如消息处理函数 WndProc 等,这些本身就是提供给用户自由定制的。如果做成 Windows API 一切都写死了,给你用还有什么意义,那倒不如所有的东西都隐藏起来也封装在 Windows API 里由操作系统直接替你完成调用岂不是更方便,还让你多此一举写一遍。
函数声明,比如:
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
结构是:返回值 函数名(参数1类型 参数1名称, 参数2类型 参数2名称, ..., 参数N类型 参数N名称);
函数调用之前必须要先声明。或者函数调用在函数体之后,则可以不用声明。
函数调用结构:
函数名(实际参数1, 实际参数2, ..., 实际参数N);
返回值 = 函数名(实际参数1, 实际参数2, ..., 实际参数N);
即函数声明中的参数是形式参数,只是个名字和类型。调用的时候,将把实际的参数传入。SetWindowsHookEx 已经在头文件中声明过了,你那样写是函数调用不是声明。
至于你说的 "把所有函数都变为API函数不是很方便吗" 根本就是不可能的。操作系统提供这些函数是为了你编程方便,但是实际上编程不可能只调用系统的函数,用户写自己函数是绝对不可避免的。C/C++ 编程就是由函数组成,他至少包含一个 WinMain(VC)函数,还有如消息处理函数 WndProc 等,这些本身就是提供给用户自由定制的。如果做成 Windows API 一切都写死了,给你用还有什么意义,那倒不如所有的东西都隐藏起来也封装在 Windows API 里由操作系统直接替你完成调用岂不是更方便,还让你多此一举写一遍。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数前面的类型是返回值的类型,在声明和定义函数的时候必须要指定。
这里的KeyboardProc是一个函数声明,他需要指定返回值类型,每个参数也需要指定类型。
这里的SetWindowsHookEx是函数调用,是在执行这个函数,所以不需要指定类型,但是他传入的参数和接收返回值的变量必须和他声明时的类型一样。他是Windows API,所以他的声明存在于操作系统的头文件中。
这里的KeyboardProc是一个函数声明,他需要指定返回值类型,每个参数也需要指定类型。
这里的SetWindowsHookEx是函数调用,是在执行这个函数,所以不需要指定类型,但是他传入的参数和接收返回值的变量必须和他声明时的类型一样。他是Windows API,所以他的声明存在于操作系统的头文件中。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这段代码是C语言的函数说明,因为“)”后面是分号。
在说明函数时,返回类型有三种选择,1是指定某种类型(比如:基本类型的int,*double等和构造类型),2是void,表明该函数不返回任何值,3是什么都不写,这表明该函数返回int类型数据。
以上是说明,接下来还有函数定义,定义函数时必须与说明时的返回类型相同,否则,编译必定报错。
在说明函数时,返回类型有三种选择,1是指定某种类型(比如:基本类型的int,*double等和构造类型),2是void,表明该函数不返回任何值,3是什么都不写,这表明该函数返回int类型数据。
以上是说明,接下来还有函数定义,定义函数时必须与说明时的返回类型相同,否则,编译必定报错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询