声明与定义分离
声明:将声明单独封装成一个以.h为后缀名的头文件
定义:将定义的变量,函数,数组所在的源文件单独封装成一个.c文件。其实就是在源文件基础上将定义过的所有东西的声明分离出去就是了。
注意:1.声明的.h文件名和.c结尾的源文件名要相同、
2.一个源文件对应一个头文件
1.预编译
1.程序编译
1.预编译
展开头文件
定义宏
选择性编译
注意:
展开头文件必须以#开头
2.编译
3.汇编
4.链接
2.include
作用:展开头文件
语法:
#include<> 尖括号代表的头文件是在系统指定文件中找该库,具体在lib/或者在usr/lib文件中找
#include"" "" 代表的是自己定义的库,会先在当前目录文件夹下找,如果找不到再在系统指定文件夹中找
3.宏(define)
1.定义不带参的宏
define pi(宏名) 值
注意:1.定义不带参的宏,值可以不写
2.不带参的宏定义不要后面加分号
3.只能在当前文件中使用
4.在宏定义后,取消定义前使用
例子:
2.定义带参的宏
define 宏名(形参) a + b(体) ;
3.注意:
1.结尾要加分号
2.括号中可以加形参,后面运算表达式不能省
3.形参没有数据类型
4.不止在当前文件中使用,可以在别的文件中使用
4.带参和不带参的宏的区别:
宏:在预编译时对其进行替换,如果一个文件中多次使用宏,那意味着要替换多次,此时就需占用内存,所以占据的内存多
产生的预编译时期
占内存多
6.总结
宏就是在预编译时期对其进行替换
不带参宏替换的是一个值
带参宏替换的是一段代码
4.选择性编译
作用:选择代码是否被编译
语法:
2.库
作用:
也叫代码库,可以将一些目标文件放在一起合并方便使用
分类:
1.静态库
2.动态库
动态库与静态库的区别:
注意:
程序中引入的文件在动态库与静态库同时存在两份
静态编译程序引入静态库中的该文件
编辑命令:
静态库:
gcc -static 源文件名 - o 生成的可执行文件名
动态库:
gcc 源文件名 - o 生成的可执行文件名
静态库:
制作:
gcc -c 源文件名.c -o 生成的二进制文件名.o
ar rc lib静态库名称.a 生成的二进制文件名.o
动态库
制作:
命令:
gcc -shared 源文件名 -o 生成的动态库文件名.so
使用:
情况1:使用动态库的文件与动态库在同一文件夹下
命令:
情况2:使用静态库的文件与静态库不在同一文件夹下
命令:
情况3:静态库文件与对应的头文件在系统文件夹下
命令:
gcc 源文件名 -l 静态库名 -o 生成的可执行文件名
注意:
运行中出现动态库找不到问题,需要将动态库所在目录导入用户环境变量
export LD_LIBRARY_PATH=库文件所在路径:$LD_LIBRARY_PATH