由于我们在程序中并没有定义 DEBUG 宏,所以第 8~9 行的代码就不会被执行:

文章插图
那么如何才能够在程序中不定义 DEBUG 宏的情况下执行第 8~9 行的代码呢?答案是通过 -D 参数:

文章插图
需要注意的是,-D 参数必须在生成 test.o 前使用(链接前) 。如下所示,是无效的:

文章插图
说了这么多,-D 参数有什么用呢?下面我们简单叙述一下 -D 参数的应用场景 。
1.4.1.1 应用场景一在发布程序的时候,一般都会要求将程序中所有的 log 输出去掉,如果不去掉会影响程序的执行效率,很显然删除这些打印 log 的源代码是一件很麻烦的事情,解决方案是这样的:
- 将所有的打印 log 的代码都写到一个宏判定中,可以模仿上边的例子;
- 在调试程序的时候指定 -D,就会有 log 输出;
- 在发布程序的时候不指定 -D,log 就不会输出;
- 每个用户对应一个维护分支,用户 A 对应 project_1 分支包含付费功能的代码,用户 B 对应的 project_2 分支不包含付费功能的代码 。
- 当用户 B 付费订阅时,再将付费项目的代码拷贝到 project_2 中
#include <stdio.h>int main(){#ifdef CHARGE//付费用户执行流程printf("该用户已付费,执行付费功\n");#else//白嫖用户执行流程printf("白嫖用户,拒绝执行付费功能\n");#endifprintf("公共功能\n");return 0;}在编译付费用户的时候,添加 -D CHARGE 参数;编译白嫖用户,则不添加 。这样的话,不管来多少用户,都只需要维护一个分支即可 。1.4.2 指定 C 方言(-std)对于如下 C 语言代码:
#include <stdio.h>int main(){for (int i = 1; i <= 3; i++){printf("i = %d\n", i);}return 0;}在编译时是会报错的:
文章插图
但如果我们加上 -std=c99,就可以了:

文章插图
二、静态库和动态库2.1 扫盲库是「已经写好的、供使用的」可复用代码,每个程序都要依赖很多基础的底层库 。
从本质上,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 。程序中调用的库有两种「静态库和动态库」,所谓的「静态、动态」指的是链接的过程 。
2.2 静态库2.2.1 静态库简介在 Linux 中静态库以 lib 作为前缀、以 .a 作为后缀,形如 libxxx.a(其中的 xxx 是库的名字,自己指定即可) 。静态库以之所以称之为「静态库」,是因为在链接阶段,会将汇编生成的目标文件 .o 与引用的库一起链接到可执行文件中,对应的链接方式称为静态链接 。
2.2.2 静态库的生成在 Linux 中静态库由程序 ar 生成 。生成静态库,需要先对源文件进行汇编操作得到二进制格式的目标文件(以 .o 结尾的文件),然后再通过 ar 工具将目标文件打包就可以得到静态库文件了 。

文章插图
使用 ar 工具创建静态库的一般格式为
$ ar -rcs libxxx.a 若干原材料(.o文件):2.2.3 静态库的制作举例在某目录中有如下源文件,用来实现一个简单的计算器 。
经验总结扩展阅读
- java中GC的日志认识详解
- 2023年摩羯座财运1月运程详解如何提高
- 我的世界指令附魔攻略(我的世界附魔1000级的指令)
- JUC中的AQS底层详细超详解
- 图文详解 微服务 Zipkin 链路追踪原理
- 电影谜一样的双眼剧情详解?
- 谍影重重4剧情详解?
- 西虹市首富剧情详解?
- 唐人街探案3剧情详解_唐人街探案3讲了什么剧情
- 2023年农历二月十八黄历宜忌详解
