编辑预处理
种类如下三种:
#include “文件名.h” // 文件包含功能
#define 宏代换命令 // 宏定义代换功能
if ~#endif
条件命令可以在函数内,但不建议遮掩做 // 条件选择编译功能
编辑预处理命令定义均已编译预处理标识符“#”起始,且命令的末尾不加分号“;”;
宏定义与宏代换
1、不带参数的宏定义:
#define PI 3.14
2、带参数的宏定义
#define MAX(x,y) (x>y)?x:y
形参为了不引起歧义,加上括号;
带参宏定义也可嵌套使用,即定义一个宏定义,可以引用另一个宏定义进行定义;
例子:
// 宏定义使用
#define PR printf // 代表printf
#define NL "\n" // 代表回车符
#define SP " " // 代表空格字符
#define D "%d" // 代表 %d 格式控制
#define F "%f"
#define D1 D NL // 代表D NL 定义
#define F1 F NL // 代表F NL嵌套定义
#define F2 F SP F1 // 代表F SPF1嵌套定义
#define S "%s" // 代表"%s"格式控制
void main(){
int a,b;
float c,d;
char str[]="the beautful lake";
a=123456;
b=200;
c=3.14159;
d=7.9;
PR(D1,a); // 宏展开为printf("%d""\n",a);即printf("%d\n",a);
PR(F1,c); // 宏展开为printf("%f" "\n",c)
PR(F2,c,d); // 宏展开为printf(" %f" " " "%f" "\n",c,d);
PR(S,str); // 宏展开为printf("%s",str)
PR(NL); // 宏展开为printf("\n")
}
自己不要写这么复杂,就是了解能看到别人写的代码
带参数的宏定义和带参数的函数,在使用上有何不同?
宏定义作用域
作用范围:从宏定义命令开始到程序结束;如果需要在源程序的某处终止宏定义,则需要使用 #undef命令取消宏定义;
文件包含处理
#include “文件名” 或者 #include <文件名>
双引号表示先在所在目录中查找包含文件,若找不到再到系统标准库目录中查找;尖括号表示在标准目录下查找该文件;
#预处理文件包含过程:
// 编写格式控制宏定义,集中形成 .h 头文件。以便在其他文件程序终身使用
// Sphere.h 头文件
#define PI 3.1415926535
#define S(r) PI*r*r
#define V(r) 4.0/3.0*S(r)*r
#define PR printf
#define NL "\n"
#define F "%f"
float shell(float r){ // 函数定义
return (V(r+0.9567)-V(r));
}
// 主程序:测试头文件
#include "stdio.h"
#include "sphere.h"
void main(){
float r;
printf("Enter the radius:");
scanf("%f",&r);
PR("The Space is:"NL);
PR(F NL,S(r));
PR("The Volume is: "NL );
PR(F NL,V(r));
PR("The shell is:"NL);
PR(F NL,shell(r));
}
**多个相关关联的文件包含和嵌套使用的逻辑顺序**
## 条件编译命令
1、#if ~ endif 结构一般形式
#if 常量表达式
程序模块
#endif
例子:
```c
#define MAX 0
#if MAX ==0
#define MAX 5
#endif
main(){
int x=3;
while(x<MAX){
printf("x=%d,",x);
x++;
}
}
// 答案是:3,4
2、 #if#else#endif结构
#if 常量表达式
语句;
#else
语句
#endif
例子:
#define MAX 16
#if MAX >10
#define MAX 10
#else
#define MAX 5
#endif
main(){
int x=3;
while(x<MAX){
printf("x=%d,",x);
x++;
}
}
3、#if~ #elif~#endif
#if 常量表达式1
语句1;
#elif 常量表达式2
语句2;
#endif
例子:
#define MAX 20
#if MAX>10
#define MAX 10
#elif MAX >5
#define MAX 3
#elif MAX >2
#define MAX 2
#endif
main(){
int x=0;
while(x<MAX){
printf("x=%d,",x);
x++;
}
}
4、 #ifdef 和ifndef 编译命令
#ifdef条件便已命令的一般形式为
#ifdef 宏名标识符
#ifndef条件便已命令的一般形式为
#ifndef 宏名标识符
#ifdef和#ifndef 条件编译命令的功能,是用来识别宏名是否被定义过
#ifdef和#ifndef 的区别:
#ifdef 判断宏名如果被#definde 命令定义过,则为真;
#ifndef 判断宏名如果没有被 #define命令定义,则为真;
宏定义宏命令尽量都要在main()主函数之前,尽量不要在任何函数中间含有 #宏定义;
每天就这样坚持,只专注此刻当下,完成今日所需,就不怕前路漫漫