赞
踩
预处理是源文件编译前所做的预备工作,预处理是要借助预处理程序的,
在源文件编译时,编译器会自动启动预处理程序进行预处理指令的解析,
处理完成后才会进入编译;
2.1 宏定义
格式: #define 宏名称 常量数据
带参格式: #define 宏名称(形参)常量数据
预处理:将程序中宏定义后的所有宏名称(不在字符串中)用常量数据进行替换
这个过程也被称为宏展开
宏展开:预处理程序仅作常量数据替换,并不检查语法,检查语法是在预处理后的编译阶段才会被检测;
2.2 文件包含
文件包含:在一个文件中包含另一个文件的全部内容
指令实现:#include
一般格式:#include"文件名"
#include<文件名>
例子:#include<stdio.h>
“ ”和 <>的区别
#include"文件名" #include<文件名>系统会到系统头文件路径下查找, Linux系统头文件路径:/usr/include •#include<文件名> #include"文件名" 系统会到当前路径下去查找被包含的文件,如果未找到再去系统头文件路径下查找
指令处理过程:用被包含文件中的内容去替换预处理指令
2.3 条件编译
条件编译含义: 给编译指定一个条件,满足条件的源代码会被编译,不满足条件的源代码会被预处理程序从从整个代码中删除。
条件编译格式:
1. #if 条件 • #else # endif
2. #ifdef 符号 • #else # endif
3. #ifndef 符号 • #else # endif
头文件作用:1. 用于类型定义(自定义类型,类型重命名(typedef));
2. 函数申明
面试题: 如何避免头文件被重复包含?
思想: 第一次包含时,将被包含的文件内容去替换 #include,此后,如果出现同名头文件时,则让文件的内容有空;
实现: 借助于条件编译 在头文件最开始:
#ifndef 符号 #define 符号
文件内容
#endif
4.1 什么是库文件?
库文件本质上是经过编译的可执行代码(库文件是不能单独执行)的二进制形式,可库文件是可以被系统加载到内存中执行
库文件是根据操作系统不同,有不同的格式,换句话说,不同的操作系统下的库文件是不同的,是不兼容的。例如:Linux系统下的库文件,是无法在windows系统下使用的
4.2 库文件的分类
1)静态库 Linux(*.a)
Windows (*.lib)
2)动态库(共享库) Linux(*.so .major . minor)
Windows (*.dll)
4.3 静态库和动态库的区别:
库文件中的代码被加载的实际是不同的:
1) 静态库是在程序编译链接时被复制到最终的可执行程序中,最终可执行程序就含有源文件的代码,和库文件的代码,所以生成的可执行程序往往比较大;
2) 动态库是在程序运行的时候由系统加载到内存中供可执行程序使用的,链接时仅仅是将函数符号加入可执行程序。所以生成的可执行程序往往比较小
4.4 库文件的生成: 说明: Linux 系统中对库文件的命名有一定的规范,遵循以下格式: libxxxx.a / libxxxx.so
xxxx 可被认为是库名称:
linux系统下,库文件往往是存放在 /lib 和 /usr/lib 路径下,系统中链接库文件, 系统也是到该目录下去查找的
1) 静态库文件的生成: 1.1 将源文件生成目标文件: *.c ---> *.o 具体实现: gcc -c *.c -o *.o (-L//指定路径) 1.2 将目标文件归档转换为静态库文件: 具体实现:借助于归档指令 ar 格式: ar 选项 归档后的文件 要归档的文件 ar -rcs libxxxx.a *.o 2) 动态库文件的生成: 2.1 将源文件生成目标文件(与加载位置无关的代码): *.c ---> *.o 具体实现: gcc -c *.c -fPIC -o *.o 2.2 生成动态库 具体实现: gcc *.o -shared -o libmyLib.so 或者: gcc *.c -fPIC -shared -o libmyLib.so 注意: 动态库使用时,程序链接动态库时,仅仅将动态库中的函数符合添加到可执行程序, 可执行程序运行时,才会加载动态库,所以我们在给用户提供可执行程序时,必须连同 动态库一起提供。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。