1、宏定义 #define
宏定义在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”,被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。在C语言中,宏分为有参数和无参数两种。
无参宏的宏名后不带参数,其定义的一般形式为:#define 标识符 字符串; ,“字符串”可以是常数、表达式、格式串等。
常常对程序中反复使用的表达式进行宏定义。例如:
、
它的作用是指定标识符M来代替表达式(yy+3y)。在编写源程序时,所有的(yy+3y)都可由M代替,而对源程序进行编译时,将先由预处理程序进行宏代换,即用(yy+3y)表达式去置换所有的宏名M,然后再进行编译。
C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对于带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为:#define 宏名(形参表) 字符串;
带参宏调用的一般形式为:宏名(实参表);
举例:
- #include <stdio.h>
- #define MAX(a,b) (a>b)?a:b
- /*带参数的宏定义*/
- main()
- {
- int x,y,max;
- printf("input two numbers: ");
- scanf("%d %d",&x,&y);
- max=MAX(x,y);
- printf("max=%d\n",max);
- /*宏调用*/
- }
结果如下:
- input two numbers: 2009 2010↙
- max=2010
可以看到,宏替换相当于实现了一个函数调用的功能,而事实上,与函数调用相比,宏调用更能提高C程序的执行效率。
#define 后面只有一个参数的语法:
一般情况下,宏定义时的用法为:#define a b ,后接两个参数,表示用a代替b。很多时候,#define 后只有一个参数,经常出现在头文件的开始处。
用法解释: 定义宏,并在预处理过程中将其替换为空字符串(即删除)。这样做主要是为了标记某些内容,使程序阅读者能够清楚标记表明的意义,同时又不影响被编译的源代码。也就是说,用法同define后接两个参数一样,只是后一个参数为空字符串。
用途包括:(1)定义一个符号用来给#if(n)def判断。(2)多文件编译中防止头文件被重复包含。
|