目录
预编译指令
1.1 编译流程
1.2 文件包含
1.3 条件编译
1.4 宏定义
1.5 无参宏
1.6 typedef和无参宏的区别
1.7 有参宏
1.8 函数与有参宏的区别
1.9 取消宏定义 #undef
1.10 符合使用
模块化操作
1.1 H文件:固定模版
1.2 C文件:源文件---源代码
1.3 模块化
1.4 模块化编译
预编译指令
1.1 编译流程
预编译-->编译-->汇编-->链接
预编译指令是在预编译阶段执行的
主要作用:检查代码格式问题,进行文件引用
1.2 文件包含
#include <file.h>
<> 在系统库路径下查找头文件
#include “file.h”
“” 优先在工程路径下查找,再去系统库路径下查找
文件包含:把查找到的头文件内容拼接当当前位置
1.3 条件编译
#if 0
#else
#endif
1.4 宏定义
进行宏名和字符串的等价替换,不进行任何运算和字符的添加
1.5 无参宏
#define MAX 50
printf(“%d\n”, MAX); // 50
#define A 2+3
printf(“%d\n”, A); // 5
printf(“%d\n”, A*5); // 17
A*5 的展开宏:2+3*5
1.6 typedef和无参宏的区别
typedef:程序运行时生效,关键字,重命名数据类型/重定向函数,
无参宏:预编译阶段生效,预编译指令,仅做替换
typedef int * INTP;
INTP m, n; // int *m; int * n;
#define INTP int *
INTP m, n; // int * m, n; int *m; int n;
1.7 有参宏
#define MIN(a,b) a>b?b:a
printf(“%d\n”, MIN(2,1)); // 1
printf(“%d\n”, 2>1?1:2);
1.8 函数与有参宏的区别
函数:程序运行时被调用,效率低,代码体积变小,参数有类型限制
宏:预编译阶段宏展开,效率高,代码体积不变,参数无类型限制
void fun(void)
{for(int i=0;i<5;i++){printf(“%d\n”,i);}
}
#define FUN() { \for(int i=0;i<5;i++) \{ \printf(“%d\n”,i); \} \
}
1.9 取消宏定义 #undef
#define MAX 50
printf(“%d\n”, MAX);//50
#undef MAX
printf(“%d\n”, MAX);//MAX 已经失效
1.10 符合使用
#ifdef MAX 如果定义的有宏 MAX,则以下代码参与编译
#endif
模块化操作
1.1 H文件:固定模版
#ifndef _FILE_H_ //文件名大写
#define _FILE_H_
//头文件内容
//内容:只进行声明
// 函数声明 结构体类型声明 外部声明变量
// 预编译指令 #include #define
#endif
1.2 C文件:源文件---源代码
包含自身的头文件
函数 全局变量
#include #define
1.3 模块化
一般来说:一个 C 文件对应一个 H 文件
但是也存在,一对多的情况
主函数所在的 C 文件:main.c
其他的 C 文件名:与模块功能有关
1.4 模块化编译
#include <stdio.h>
#include "add.h"
int main()
{add_t(1,2);return 0;
}
#include <stdio.h>
#include "add.h"
void add_t(int a, int b)
{printf("%d\n", a+b);
}
#ifndef _ADD_H_
#define _ADD_H_void add_t(int a, int b);
#endif