#define 宏定义是个演技非常高超的替身演员,但也会常常耍大牌的,所以我们用它要慎之又慎。它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就都认识这个宏了;也可以把任何东西定义成宏。因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮助。看例子:
#define PI 3.141592654
在今后的代码中尽可以使用 PI 来取代 3.141592654,而且你最好就这么做。不然的话,如果我要把PI的精度再提高一些,你是否愿意一个一个的去修改这串数呢?你能保证不漏不出错?而使用 PI 的话,我们却只需要修改一次。这种环境还不是最要命的,我们再看一个例子:
#define ERROR_POWEROFF -1
如果你在代码里不用 ERROR_POWEROFF 这个宏而将-1硬编码进代码里,尤其在函数返回错误代码的时候(往往一个开发一个系统需要定义很多错误代码)。肯怕天主都无法知道-1 表示的是什么意思吧。这个-1,我们一般称为“魔鬼数”,天主遇到它也会发狂的。所以,我奉劝代码里一定不要出现“魔鬼数”。
关键字篇我们讨论了 const 这个关键字,我们知道const 修饰的数据是有范例的,而 define 宏定义的数据没有范例。为了安全,我建议以后在定义一些宏常数的时候用 const 取代,编译器会给 const 修饰的只读变量做范例校验,镌汰错误的可能。但一定要注意const修饰的不是常量而是readonly的变量,const 修饰的只读变量不能用来作为定义数组的维数,也不能放在 case 关键字后面。
#define ENG_PATH_4 "E:\\English\\listen_to_this\\listen_to_this_3"
预处理: 预处理指令,头文件睁开,去掉注释,宏替换,条件编译 (顺序是怎样的?)
编译: C语言翻译成汇编语言
汇编: 将汇编代码转化成可重定向目的文件(可被链接)
链接: 自身程序+库文件进行关联,形成可执行程序
预处理指令和宏谁先处理是不可预期的.总之,通过这点我们知道了预处理过程去注释是先于宏替换的.
举个例子见一见条件编译的代码
我们常常听说过,某某版程序是完全版/精简版,某某版应用是商用版/校园版,某某软件是基础版/扩展版等。
其实这些软件在公司内部都是同一个项目,是多个源文件构成的。所以,所谓的差别版本,其实就是那些功能的有无;在技术层面上,公司为了好维护,可以维护多种版本;如果是使用条件编译,想使用哪个版本,就使用哪种条件进行裁剪就行。
如著名的Linux内核,功能上也是使用条件编译进行功能裁剪的,来满足差别平台的软件。
[引用](C语言#if defined高级用法-CSDN博客)在一个需要完成“多个宏定义来共同控制同一代码分支”的环境下,例如
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |