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 实例步骤:
本实例通过一个对输入的数字排序的控制台程序,演示宏定义的使用。实例步骤如下所示:
- 新建一个名称为“SortApp”的空的Win32控制台应用程序;
- 向项目中添加一个名称为“main.cpp”的文件;
- 在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 )
加上括号后,确保宏定义的完整性,也保证了运算结果的正确性;
阅读全文
1 0
- 1.6 宏的使用实例
- 实例:C语言宏的使用之"##"
- Delegate的使用实例
- Grid的使用实例
- Win32API 的使用实例
- c3p0的使用实例!
- SqlCommandBuilder 的使用实例
- DecimalFormat的使用实例
- 委托的使用实例
- FileUpload的使用实例
- pyinotify的使用实例
- NinePath的使用实例
- tar 的使用实例
- SurfaceView的使用实例
- 实例化的使用
- 实例化的使用
- URL的使用实例
- 注解的使用实例
- c语言之交换一个指针数组的值
- Java面试题
- 项目管理总结
- Together项目IOS平台开发03
- android解决quick documentation(Ctrl+Q)慢的问题
- 1.6 宏的使用实例
- GIT 常用命令
- 寻找数组中和为指定数字的子数组,可以重复,Leetcode 39
- 1000 A+B problem
- java 链接mysql jdbc
- Fiddler设置断点
- c文件操作
- 大一JAVA实训第一次博客
- linux(ubuntu)安装apache2和php7后浏览器无法解析php