1.简述
预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。
预处理功能: 宏定义,文件包含,条件编译等。
2.宏定义
在c语言程序中允许一个标私服来表示一个字符串,称为宏。
在c中宏分为有参数和无参数两种。
2.1 无参宏
无参宏的名后不带参数。
格式: #define 标识符 字符串
# 表示 预处理命令 define 为宏定义命令 表示符 为定义的宏名 字符串 可以是 常数 表达式 格式串等。
例如: #define M (y*y+3*y)
例子:
#define M (y*7-y/2)
main(){
int s,y;
printf("input a number: ");
scanf("&d",&y);
s=3*M
printf("s= %d\n",s);
}
|
宏定义时应注意以下几点:
a. 宏定义中的字符串可以的任何数,预处理程序对它不做任何检测,如有错误,只能在编译已被宏展开后的源程序发现。
b. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。
e. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止操作可使用#undef命令。
例如:
#define PI 3.14
main()
{
....
}
#undef PI
f1()
{
...
}
|
表示只能在main函数中有效,在f1中无效
d. 宏名在源程序中如用引号阔气来,则预处理程序不对其作宏代换。
例子:
#define OK 23
main()
{
printf("OK");
printf("\n");
}
e. 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的红名。
例如:
#define P 2
#define S P*2
f. 可以用宏定义表示数据类型,使书写方便。
例如:
#define STU struct str
g. 对 输出格式作宏定义,可以减少书写麻烦。
例子:
#define P printf
#deifne D "%d\n"
#define F "%f\n"
main()
{
int a=5,c=8,e=11;
float b=3.8,d=9.7,f=21.08;
P(D F,a,b);
}
|
4. 带参数的宏定义
格式:define 宏名(形参) 字符串
例子:
#define M(y) x*3
K=M(4);
例如:
#define MAX(a,b) (a>b)?a:b
main()
{
int x,y,max;
printf("input two numbers ");
scanf("%d%d",&x,&y);
man=MAX(x,y);
printf("max=%d\n",max);
}
|
warning:
a.宏名和形参之间不能出现空格
b.形参不分配内存单元,因吃不必作类型定义。
c.在宏中的形参是标识符,而宏调用中的实参可以是表达式。
例如:
#define SQ(y) (y)*(y)
main()
{
int a,sq;
printf("input a number : ");
scanf("%d",&a);
sq=SQ(A+1);
printf("sq=%d\n",sq);
}
|
d. 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。在上例中的宏定义中(y)*(y)表达式的y都用括号括起来,因此结果是正确的。但是也应同时在整个字符串外加括号。
e. 宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。
例如:
#define SSSW(s1,s2,s3,v) s1=1*x;s2=2*e;s3=w*h;v=s*d/d;
5. 条件编译
条件编译有三种形式:
a. 第一种
#ifdef 标识符
程序1
#else
程序2
#endif
功能:如果标识符已被#define命令定义过则对程序1进行编译;否则对2进行编译。如果2为空,#else也可以没有。
b. 第二种
#ifndef 表示符
程序1
#else
程序2
#endif
功能:与第一种功能相反。
c.第三种
#if 常量表达式
程序1
#else
程序2
#endif
功能:如常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。
阅读(530) | 评论(0) | 转发(0) |