1.6 宏的使用实例

来源:互联网 发布:怎么修改淘宝号地区 编辑:程序博客网 时间:2024/05/20 11:27

宏定义就是用较短的符号代替一些较长的代码语句或者代码段。合理的使用宏定义,不但可以减少编码时的工作量,还能提高代码的可维护性。

1.6.1 技术要点:

  • 在Visual C++ 6.0中使用语句“#define 标识符 宏内容”即可定义一个不带参数的宏。编码时,可以用宏的标识符代替具体内容,在程序编译时,编译器自动将这些标识符代替为真正的内容;
  • 宏也可以带参数,其定义语法为“#define 标识符(参数名称列表) 宏定义”,带参数的宏在使用时类似于函数调用;
在Visual C++ 6.0中,大量地使用了宏定义,尤其在MFC中,一些关键代码都使用了宏定义。正是由于这些宏定义,使得MFC很多细节被“掩饰”了起来,使其难以理解。要读懂宏,必须先了解宏的使用。在本节将演示一些简单的宏定义使用例子。

1.6.2 实例步骤:
本实例通过一个对输入的数字排序的控制台程序,演示宏定义的使用。实例步骤如下所示:

  1. 新建一个名称为“SortApp”的空的Win32控制台应用程序;这里写图片描述这里写图片描述
  2. 向项目中添加一个名称为“main.cpp”的文件;这里写图片描述
  3. 在IDE中打开刚刚新建的文件,在其中键入如下所示代码;
//引入必须的头文件#include <stdio.h>#include <stdlib.h>//宏定义,要排序的数字个数#define MAX_NUM 10//宏定义,判断数组中的数字,并将较大的一个向后移动#define SWITCH(ar, i) if(ar[i] < ar[i + 1]){ \    int nTemp = ar[i]; \    ar[i] = nNums[i + 1]; \    ar[i + 1] = nTemp;}//应用程序入口函数int main(int argc, char* argv[]){    int nNums[MAX_NUM];    int nCount = 0;    char chInput[16] = {0};    //输入指定个数的数字    while(nCount < MAX_NUM)    {        printf("请输入第%d个数字(回车确认):\n", nCount + 1);        *chInput = '\0';        fgets(chInput, sizeof(chInput) - 1, stdin);        nNums[nCount] = atoi(chInput);        printf("%d\n", nNums[nCount]);        nCount++;    }    //循环排序    int x, y;    for(x=0; x<MAX_NUM - 1; x++)    {        for(y=0; y<MAX_NUM-x-1; y++)        {            SWITCH(nNums, y);        }    }    //输出排序结果    printf("排序结果为:\n");    for(x=0; x<MAX_NUM; x++)    {        printf("%d\n", nNums[x]);    }    //程序暂停    system("pause");    //退出函数,结束应用程序    return 0;}

这里写图片描述

1.6.3 程序运行:
按F5键运行程序,按照提示依次输入10个数字,程序将对这些数字排序,并将排序结果显示出来,程序运行结果如图所示:

这里写图片描述

1.6.4 源程序解读:

  • 在本实例中定义了两个宏,第一个宏定义为”#define MAX_NUM 10”。这个宏指定了要排序的数字个数。在程序代码中,用到这个数字的地方,并没有直接写成数字10,而是用MAX _NUM代替。这样便于程序的修改,如果要将要排序的数字个数改为20,则只需对此语句进行修改,不用再对代码做任何修改;
  • 本实例中定义的第二个宏由多行代码组成,在具体编码时,可以用一个标识符代替这几行代码,增强了代码的可阅读性。从第二个宏定义还可以看出,如果要在宏定义内换行,可以使用符号“/ ”;
  • 除了本例中演示的宏定义外,宏定义还有一些更高级的用法,如用“#”将类型变成字符串,用“##”连接字符串等。这些符号的具体含义可以参照MSDN中对“#define”关键字的描述;
  • 宏定义虽然可简化代码,但其缺点也很明显,如宏定义在调试时无法单步跟踪、宏定义没有类型和命名空间对宏定义无效等,这些缺点给程序的维护造成一定的困难,所以不推荐在编程时滥用宏定义。对于变量型的宏定义可以用常数替代,带参数的宏定义可以用内联函数替代;

由于宏定义在编译时会完全展开,所以要将它和真正的常量区分开,如果宏定义中有运算符,最好加上括号。如所示的宏定义:

#define WIDTH 80#define LENGTH WIDTH + 10

定义了一个矩形长度和宽度,如果要计算该矩形的面积,则表达式如下所示:

int nArea = WIDTH * LENGTH

这样的语句看起来合理,但实际展开后变成如下所示:

int nArea = 80 * 80 + 10;

由于运算符“+”的优先级低于运算符“*”的优先级,造成实际的运算结果错误,并且此类错误非常隐蔽,难以发现。要防止此类错误,在定义时应该将语句修改为如下所示:

#define WIDTH 80#define LENGTH ( WIDTH + 10 )

加上括号后,确保宏定义的完整性,也保证了运算结果的正确性;

原创粉丝点击