//输出结果
printf("a=%d,b=%d,x=%d,y=%d\n", a,b,x,y);
return 0;
}
//函数实现
void Exchange(int* arg1, int* arg2)
{
int temp=0;
temp = *arg1;
*arg1 = *arg2;
*arg2=temp;
}
解说:为了避免过多的子函数出现在main前而将main“埋没”,采取了函数的“前置声明”和“后置实现”。特别注意:前置声明函数的时候,甚至可以只给出参数的类型而不必给出参数的名称。
[总结]
至此,一个结构美观,功能实用的小程序就进化完成了——从仅仅8个字符进化到十几行。之所以给大家展示这样一个程序,就是因为我们下面要看的Win32程序虽然复杂,但也是这样一点一点进化来的。
三.正式开始
热身运动结束之后,我们就要正式剖析一个Win32的程序了。Win32的程序远比命令行程序复杂,而且变量名和函数名也要长得多,入口点函数的参数也比较多也比较复杂……呃……入门的门槛比较高,做好心理准备哦!
[一级]:一个什么都不干的Win32程序
#include <windows.h>
WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
}
解说:比起命令行下那个只有8个字符的最简单程序来,Win32最简单的程序也足够复杂了。首先,#include<windows.h>指令是绝不能缺少的(就算以后你在程序中没有直接include这个windows.h文件,那么也一定是通过别的.h文件间接地包含了它),不要指望编译器会自动为你添加这一句。其次,入口点函数的名称也不再是main而是WinMain,而且WinMain也不像main那样能够支持有参数和无参数两种形式,WinMain函数只有一种形式,那就是接收4个参数(参数的数据类型怪怪的,如果想知道具体是什么类型,可以参见本人的另一篇掘作《Windows数据类型探幽——千回百转你是谁?》)。目前,最重要的是你要盯紧那第一个参数,也就是HINSTANCE类型的hInstance变量。
[二级]
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
return 0 ;
}
解说:在[一级]的基础上,除了像main一样添加了int返回值类型和return 0之外,还添加了一个WINAPI修饰符。这个宏(如果还不了解什么是“宏”,请学习C/C++语言基础知识)的实际值是__stdcall,__stdcall是Microsoft公司对C/C++语言扩充时添加的Keywork,这个Keywork是专门用于呼叫Win32 API时使用的(所以宏的名字叫“WINAPI”),而且在出现这个Keywork的时候,被修饰函数的参数传递顺序是从右向左,被修饰函数被调用完后,还要负责清理自己所占用过的栈内存——这些不理解不要紧,并不影响我们的入门学习。
[X级]
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, Win32!"), TEXT("问候"), MB_OK) ;
MessageBox(NULL, L"Hello, Win32!",L"问候",0);
return 0 ;
}
解说:这次是添加了核心代码(上下两句其实是完全一样的,只是上面一句使用了预先定义的宏方便了记忆,而下面一句是“原始面貌”)。MessageBox函数会让程序弹出一个消息框,第一个参数是指出哪个窗体拥有这个消息框,我们的程序还没有窗体,所以只能用一个NULL值,接下来的两个不说你也应该看出来,一个是内容,一个是标题。不过要注意,由于是32位程序设计,所以要用L(即TEXT()宏的原形)来把16位字符串转换成32位字符串。最后一个参数是消息框的按钮数量——MB_OK就是只有一个OK按钮,对应的值是0;MB_YESNO就是有Yes和No两个按钮,对应的值是4……总之,用记宏比你记没有形象的整数值要方便多了。