编译与预处理
编译预处理是指C语言对源程序在正常编译之后先执行源程序中的预处理命令。预处理后源程序在被正常编译,从而得到目标代码。预处理是编译的一部分,是编译中最先执行的部分。
预处理
在C语言中带#的行都是预处理命令,后面不加“;”结束符。多数编译的预处理都放在程序头,也可以根据需要放在的任何位置。
宏定义
在C语言中允许用一个标识符来表示一个字符串,称为宏。宏有有参宏和无参宏。
无参宏定义
#define 标识符 字符串
Eg:#define IP 7.155488995(减少程序的重复书写,见名知义,提高程序的可读性)
1.用宏定义命令定义符号常量时,通常使用大写,便于区别变量。
2.预处理对符号常量的处理只是简单替换,不做语法检查,只能在正式编译中检查出错误。
3.宏可以嵌套
终止宏命令
#undef 标识符
Eg:
#deine M 50
…
#undef M
#define _CRT_SECURE_NO_WARNINGS 1
#include"stdio.h"
#define M (y*y+3*y)
void main()
{
int s, y;
printf("intput a number");
scanf("%d", &y);
s = 3 * M + 4 * M + 5 * M;
printf("s=%d\n", s);
}
带参宏定义
#define 宏名 字符串
#define SQ(x) (x)(x)
SQ是宏名,x是形参,字符串是(x)(x),a=SQ(5);5是实参,替换宏体中出现中的形参x。替换后a=(5)*(5).
Eg:求三角形的面积
#include<math.h>
#define S(a,b,c)(a+b+c)/2
#define Srt(a,b,c)S(a,b,c)*(S(a,b,c)-a)*(S(a,b,c)-b)*(S(a,b,c)-c)
#define Area(a,b,c) sqrt(Srt(a,b,c))
void main()
{
int x = 44, y = 67, z = 30;
float area;
area = Area(x, y, z);
printf("area=%.2f\n", area);
}
带参宏与函数的本质区别:
1.定义形式不同
2.处理时间不同
3.处理机制不同
4.时间和空间的开销不同
5.带参的宏定义命令设法获得多个结果,而函数的返回值只有一个