预处理命令:
1、必须以#开头
2、通常位于程序开头部门
编译器在对C程序或Object-C程序编译之前,会对这些预处理命令进行处理,然后将这些预处理结果与源文件一起编译。
#define、#undef执行宏定义
#define:作用是为字符串起一个名字
#undef :提前结束宏定义
注意:
宏定义不是C语句,不要用=给红名称赋值,无需分好结束;
编译器处理宏定义只是进行“查找”、“替换”,将红名称替换为对应的字符串。
宏定义还可以引用另一个宏,形成嵌套替换的宏
宏定义还可以带参数
#define 宏名称(参数列表) 字符串
#include <stdio.h>
#define PI 3.1415926
#define TWO_PI PI*2
#define GRITH(r) PI * 2 * r
//宏定义有参数时最好加括号
#define GRITH2(r) PI * 2 * (r)
#define AREA(r) PI * (r) * (r)
void yuchulitest1_1(){
double radius;
scanf("%lg", &radius);
printf("园周长为:%g\n", TWO_PI*radius);
printf("园面积为:%g\n", PI*radius*radius);
printf("\n\n");
//r为3+1时,GRITH(r) 为 3.1415926 * 2 * 3 + 1
printf("RTITH(3+1)园周长:%g\n", GRITH(3+1));
printf("RTITH2(3+1)园周长:%g\n", GRITH2(3+1));
printf("AREA(3+1)园面积:%g\n", AREA(3+1));
}
//结束宏定义
#undef PI
#undef TWO_PI
还可以通过是否定义某个宏来进行条件编译:#ifdef、#ifndef、#endif
还可以通过判断表达式或已有宏表达式来决定是否编译指定语句:#if、#elif、#else、#endif
#include <stdio.h>
#define IPAD
#define DEBUG
#define AGE 26
void yuchulitest2_1(){
//是否定义某个宏
#ifdef IPAD
int a = 5;
int b = 9;
printf("交换前a=%d,b=%d\n", a,b);
int tmp = a;
a = b;
b = tmp;
printf("交换后a=%d,b=%d\n", a,b);
#else
printf("没有定义IPAD\n");
#endif
#ifndef DEBUG
printf("没有定义DEBUG\n");
#else
printf("定义了DEBUG\n");
printf("定义了DEBUG\n");
#endif
//条件编译,对宏进行判断
#if AGE > 60
printf("老年人\n");
#elif AGE + 20> 40
printf("中年人\n");
#elif AGE > 20
printf("青年人\n");
#else
printf("未成年\n");
#endif
}
可以通过定义DEBUG宏来控制是否执行输出语句。
可以通过定义IPAD宏来控制是否编译IPAD相关代码。
程序中以后经常需要修改的值可以定义为宏,避免程序中硬编码这些值。
#include:导入其他源程序到当前源程序代码的指定位置。
需要我们自行判断是否重复导入。
例如A导入B和C,而B里面也导入了C,这样A就重复导入了C,应该只导入B就可以了。
导入自己定义的源程序用“”,导入系统程序用<>