网站设计模块,西安市建设工程信息网平台官网,中国销售网,微享网络网站建设声明与定义分离
声明#xff1a;将声明单独封装成一个以.h为后缀名的头文件
定义#xff1a;将定义的变量#xff0c;函数#xff0c;数组所在的源文件单独封装成一个.c文件。其实就是在源文件基础上将定义过的所有东西的声明分离出去就是了。
注意#xff1a;1.声明的…声明与定义分离
声明将声明单独封装成一个以.h为后缀名的头文件
定义将定义的变量函数数组所在的源文件单独封装成一个.c文件。其实就是在源文件基础上将定义过的所有东西的声明分离出去就是了。
注意1.声明的.h文件名和.c结尾的源文件名要相同、 2.一个源文件对应一个头文件
1.预编译
1.程序编译
1.预编译 展开头文件 定义宏 选择性编译 注意 展开头文件必须以#开头
2.编译
3.汇编
4.链接
2.include
作用展开头文件
语法 #include 尖括号代表的头文件是在系统指定文件中找该库具体在lib/或者在usr/lib文件中找 #include 代表的是自己定义的库会先在当前目录文件夹下找如果找不到再在系统指定文件夹中找 注意 1,include 经常用来包含头文件可以包含 .c 文件但是大家不要包含.c 因为 include 包含的文 件会在预编译被展开如果一个.c 被包含多次展开多次会导致函数重复定义。所以不要包含.c 文件 2,预处理只是对 include 等预处理操作进行处理并不会进行语法检查 这个阶段有语法错误也不会报错第二个阶段即编译阶段才进行语法检查 3.宏define
1.定义不带参的宏 define pi(宏名) 值 注意1.定义不带参的宏值可以不写 2.不带参的宏定义不要后面加分号 3.只能在当前文件中使用 4.在宏定义后取消定义前使用
例子 #include stdio.h #define PI 3.14 #define X int main(int argc, char const *argv[]) { printf(PI%f\n,PI); #undef PI //取消宏定义 //printf(PI%f\n,PI); return 0; } 2.定义带参的宏 define 宏名形参 a b体
3.注意 1.结尾要加分号 2.括号中可以加形参后面运算表达式不能省 3.形参没有数据类型 4.不止在当前文件中使用可以在别的文件中使用
4.带参和不带参的宏的区别 宏:在预编译时对其进行替换,如果一个文件中多次使用宏,那意味着要替换多次,此时就需占用内存,所以占据的内存多 产生的预编译时期 占内存多 速度快 函数:在程序运行时在代码区存储一份,每次调用该函数都需在代码区寻找,将其放入栈内存中(压栈),当函数执行完毕后,从栈中移除(弹栈) 产生在运行时 占内存少 5.#undef 宏名 //取消宏定义 6.总结 宏就是在预编译时期对其进行替换 不带参宏替换的是一个值 带参宏替换的是一段代码
4.选择性编译
作用选择代码是否被编译
语法 2.库
作用 也叫代码库可以将一些目标文件放在一起合并方便使用
分类
1.静态库
2.动态库
动态库与静态库的区别 注意
程序中引入的文件在动态库与静态库同时存在两份
静态编译程序引入静态库中的该文件 动态编译程序引入动态库中的该文件 编辑命令
静态库 gcc -static 源文件名 - o 生成的可执行文件名
动态库 gcc 源文件名 - o 生成的可执行文件名
静态库
制作 gcc -c 源文件名.c -o 生成的二进制文件名.o ar rc lib静态库名称.a 生成的二进制文件名.o 注意静态库起名的时候必须以 lib 开头以 .a 结尾 使用 情况1: 使用静态库的文件与静态库在同一文件夹下 命令: gcc 源文件名 静态库名称 -o 生成的可执行文件名 情况 2: 使用静态库的文件与静态库不在同一文件夹下 注意: 为了让静态库文件与其对应的头文件和使用静态库文件不在同一文件夹下 所以创建includes与 libs 文件夹 includes文件用于存储头文件 libs文件夹存储静态库文件 mkdir includes mkdir libs mv myfun.h includes/ mv libmyfun.a libs/ -L 引用的静态库所在的路径 -l 静态库名, 不要 lib 与 .a -I 头文件所在路径 命令: gcc 源文件名 -L 静态库所在的路径 -l 静态库名 -I 头文件所在路径 -o 生成的可执行文件名 情况 3: 静态库文件与对应的头文件在系统文件夹下 系统库路径: /usr/include 存储头文件 /usr/lib 或 /lib 存储库文件 注意: 为了让静态库文件与其对应的头文件和系统文件夹下,所以需要移动 sudo mv includes/myfun.h /usr/include sudo mv libs/libmyfun.a /usr/lib 命令: gcc 源文件名 -l 静态库名 -o 生成的可执行文件名 动态库 制作 命令 gcc -shared 源文件名 -o 生成的动态库文件名.so 使用 情况1:使用动态库的文件与动态库在同一文件夹下 命令: gcc 源文件名 动态库名称 -o 生成的可执行文件名 情况2:使用静态库的文件与静态库不在同一文件夹下 命令: gcc 源文件名 -L 动态库所在路径 -l 动态库名称 -I 头文件所在路径 注意 动态库名需要去掉前面的lib与后面.so 情况3:静态库文件与对应的头文件在系统文件夹下 命令 gcc 源文件名 -l 静态库名 -o 生成的可执行文件名 注意 运行中出现动态库找不到问题需要将动态库所在目录导入用户环境变量 export LD_LIBRARY_PATH库文件所在路径:$LD_LIBRARY_PATH export LD_LIBRARY_PATH./:$LD_LIBRARY_PATH