1 概念:
预处理:在编译之前做的事情,在执行代码之前做一些代码的替换,提前处理
2 宏定义符号:
2.1 含义:
预先定义好的一些宏,只要拿来就可以使用
2.2 内容:
printf("%s\n", __FILE__); //__FILE__:代表当前代码段所在的文件,是一个字符串
printf("%s\n", __FUNCTION__); //__FUNCTION__:代表当前代码段所在函数的函数名
printf("%s\n", __DATE__); //__DATE__:代表当前代码段的编译日期
printf("%s\n", __TIME__); //__TIME__:代表当前代码段的编译时间
printf("%d\n", __LINE__); //__LINE__:代表当前代码段所在文件中的行数
3 宏定义:
3.1 含义:
又称为宏替换,是使用某些特定的符号,在编译之前对源代码进行一个替换,从而完成某种功能
3.2 宏定义关键字:#define
3.3 格式:
#define 宏名 宏替换(注:是用宏名来替换宏替换,它们位置记牢),例:
#define PI 3.14(用PI来替换3.14,以下相同)
#define ENTER putchar('\n')// 使用ENTER代表putchar('\n')
#define D double// 使用D代表double
易语言:中文编程(数字)
#define 输出 printf
#define 输入 scanf
#define 主函数 main
4 带参宏:
4.1 含义:
带有参数的宏定义,可以像函数一样传递参数和调用
4.2 内容:
//求正方形的周长
#define 周长(n) n*4
//求矩形的周长
#define 矩形周长(n,m) (n+m)*2
#define IP 3.14
//求圆的面积
#define 圆的面积(r) IP*r*r //宏定义的嵌套:宏定义中又有宏定义
//带参宏给你挖的坑(重点)
1) #define SUM(n,m) n+m
2) #define SUM1(n,m) (n+m)
区别上述两个带参宏:
对于1):
SUM(1,2)* SUM(2,3)=1+2*2+3=8
对于2):
SUM1(1,2)* SUM1(2,3)=(1+2)*(2+3)=15
//归纳:宏定义称为宏替换:它只是替换而已,宏定义是先替换后计算(重点)
5 文件包含:
5.1 含义:
将其他文件的内容拿过来使用(一般是指头文件)
5.2 内容:
- 文件/资源包含的预处理命令:#include,#pragma
- 包含系统头文件时,文件名可以使用<>尖括号括起来,也可以使用" "双引号括起来
- 规范包含系统头文件时,文件名一般使用<>尖括号括起来
- 规范包含自定义头文件时,文件名一般使用" "双引号括起来
- 在项目的使用查找中,一般使用<>尖括号括起来的文件,只会在系统头文件里找;使用" "双引号括起来的文件,会在自定义头文件里找,如果没找到才会在系统头文件里找
5.3 头文件重复包含问题:
#include "test1.h" #include "test1.h" //错误(头文件重复包含:同一个头文件包含两次或两次以上) int main() { return 0; }
头文件重复包含可能会引起重定义问题
#include "test1.h" //头文件嵌套包含引起的头文件重复包含问题
为了防止头文件重复包含,在VS中一般使用预处理命令:#pragma once 解决
在自定义头文件的最前面第一行写上#pragma once可以解决头文件重复包含问题
#pragma once是VS独有的,其他平台不可用(VS是现在部分企业在用的编译工具)
6 条件编译:
6.1 含义:
根据不同的条件来编译不同的代码段
6.2 内容:
#if ……#else……#endif 的使用
#ifdef ……#else……#endif 的使用
#ifndef ……#else……#endif 的使用
6.3 作用:
#ifndef ……#else……#endif 的使用:可以用于防止头文件重复包含 ,一般用于多头文件编写项目