文档介绍:第9章 C语言预处理命令
作用:对源程序编译之前做一些处理,生成扩展C源程序
种类
宏定义#define
文件包含#include
条件编译#if--#else--#endif等
格式:
“#”开头
占单独书写行
语句尾不加分号
宏定义
在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。
宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
不带参数宏定义
一般形式: #define 宏名[宏体]
功能:用指定标识符(宏名)代替字符序列(宏体)
例如
#define PI
……
printf(“%f\n”,PI*2);
宏展开:printf(“%f\n”,*2);
#define M (y*y+3*y)
void main()
{
int s,y;
printf("input a number: ");
scanf("%d",&y);
s=3*M;
printf("s=%d\n",s);
}
(y*y+3*y);
作用域:从定义命令到文件结束
#undef可终止宏名作用域
格式: #undef 宏名
例#define YES 1
void main()
{ ……..
}
#undef YES
#define YES 0
max()
{……..
}
YES原作用域
YES新作用域
说明:
宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。
#define OK 100
void main()
{
printf("OK");
printf("\n");
}
宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。
例如:
#define PI
#define S PI*y*y /* PI是已定义的宏名*/
对语句:
printf("%f",S);
在宏代换后变为:
printf("%f",*y*y);
带参数宏定义
C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏展开中的参数称为实际参数。
对带参数的宏,在代换过程中,不仅要宏展开,而且要用实参去代换形参。
一般形式: #define 宏名(参数表) 宏体
宏体及各形参外一般应加括号()
宏展开:形参用实参换,其它字符保留
例#define S(a,b) a*b
………..
area=S(3,2);
宏展开: area=3*2;
不能加空格