预处理命令
三个主要的组成
1.宏定义替换
2.头文件包含
3.条件编译
主要 多文件的写法
代码--->编译--->可执行文件(exe)
编译之前的预处理阶段(删掉注释 宏定义 包含头文件 条件编译)
1.宏定义 作用 替换文本
#define 定义一个宏
#define 宏名 要替换的内容
一般宏后面不写分号
宏 直接替换 可以是任意内容
带参宏 类似函数
#define ADD(a,b) a+b
将ADD替换成a+b的形式 本质上是对文本操作
printf("%d
",ADD(3,4));
只适用简单的操作(里面不能有循环和递归)
直接替换
好处 函数 调用函数(需要跳转时间) 简单的函数用宏替换 不需要跳转时间
没有参数类型限制 比函数灵活
printf("ADD(3,4)=%d
",ADD(3,4)*5);//3+4*5
先替换然后计算 需要注意优先级问题
2.头文件包含
#include<头文件名字>
#include"头文件名字"
头文件 把头文件内容 直接复制到代码前面
< > 一般包含自带的头文件 stdio.h 到指定目录查找
" " 一般自己写的头文件 到项目文件夹中找 然后找系统指定目录(系统头文件所在目录)
函数
void fun()定义
{printf("helloworld")}
函数定义放在.h中 函数申明放在.c中
3.条件编译 根据某些条件 判断下面的语句是否编译
#if
#endif
#ifndef if not define 判断宏是否定义过 如果没有定义过 后面的语句就会被定义 否则就不会被定义
条件为真 后面都会被定义 调教为假 后面都不会被定义
#endif
#define
在头文件里面设置一个宏 如果包含过 就定义一下这个宏
判断这个红有没有定义过 如果有 说明之前包含过
多字节字符集 Unicode 字符集
处理方式也是不一样的
判断使用哪一种字符集
然后写出对应的函数
函数定义
1 void fun(); 2 void insist();
函数申明
1 #include <stdio.h> 2 #include "insist.h" 3 void fun() 4 { 5 printf("helloworld "); 6 } 7 void insist(){ 8 printf("insist niubi "); 9 }
主函数
1 #pragma once//防止头文件重复包含 包含头文件 ---->复制头文件内容 2 //防止重复包含 3 #include <stdio.h> 4 #include "insist.h" 5 #define 主函数 int main() 6 #define ROW 20 7 #define ADD(a,b) a+b 8 #define HELLO "helloworld" 9 #define M(a) a>=0?a:a<=10?-a:0 10 #define POW(a,b) (a*b) 11 //上面已经定义过了ROW 所以后面就不会定义了 12 #ifndef ROW 13 #define ADD(a,b) a+b 14 #define HELLO "helloworld" 15 #define M(a) a>=0?a:a<=10?-a:0 16 #define POW(a,b) (a*b) 17 #endif 18 主函数 19 { 20 insist(); 21 fun(); 22 printf("%d ",ADD(3,4)); 23 printf("ADD(3,4)=%d ",ADD(3,4)*5);//3+4*5需要注意优先级问题 24 printf("%d ",M(3));//返回3 25 printf("%d ",POW(3+4,4+5));//3+4*4+5=3+16+5=24; 26 printf("%s ",HELLO); 27 #if 0//直接注释 28 int i; 29 printf("%d ",ADD(3,4)); 30 printf("ADD(3,4)=%d ",ADD(3,4)*5);//3+4*5需要注意优先级问题 31 printf("%d ",M(3));//返回3 32 printf("%d ",POW(3+4,4+5));//3+4*4+5=3+16+5=24; 33 for (i=0;i<ROW;i++) 34 { 35 printf("%s ",HELLO); 36 } 37 #endif 38 getchar(); 39 return 0; 40 41 }