juliusun.com
第 42/50 节 冥河C语言教程
预处理指编译之前所做的工作。预处理先于编译执行。由于在编译之前执行,所以预处理不属于语句。
C语言中一般将预处理命令称作指令,我们下面仍然这样称呼。有的资料上就称作命令,也不要感到陌生。
预处理以#号开始,且#号必须是所在行第一个非空白字符(部分资料上讲#号必须是行第一个字符,尽量放在行首)。#号后面跟指针名,常用的指令如define、include。再后面根据指令不同有所不同。
预处理要单独占用一行。行内有预处理指令,其它预处理指令及C语言语句请换行书写。
不同预处理指令使用方式大不相同,本教程会一个一会介绍。
由于预处理不属于语句,所以预处理不必以分号结尾。
本节着重介绍预处理的define指令。预处理指令define用来定义宏。使用define指令的预处理命令也被称为宏定义。
预处理define指令用来定义常量。常量值一旦定义,在整个有效周期内,不允许改变。
define指令分无参和有参两种用法,无参宏定义用法如下:
#define 宏名 宏值
宏名命名规则遵循标识符定义标准。
宏定义指令define,预处理时,就是简单的替换,凡是代码中写宏名单独的地方(字符串内除外),全部原样替换成宏值。
习惯上,宏名全部大写。这并不是规定,开发及学习者随意。
例:
注意:宏定义不必分号结尾,不必说明类型。宏定义是预处理,先于编译执行,仅仅将代码中的宏名替换为宏值,就是简单的替换作用。
预处理宏定义的替换时,也称宏代换、宏展开。
#define定义有参数的宏格式为:
#define 宏名(参数1,参数2,……,参数N) 带有参数的宏值
参数也必须是合法的标识符。
例:
上面的例子能简单的说明有参宏使用方法,注意有参宏参数同样不需要类型。有参宏也是简单的替换。如果考虑到运算符优先级,上面的代码有个漏洞。例:
考虑到乘号运算符*优先级高于加号运算符+,那么3+2*3+2相当于3 + (2*3) +2,不是想要的结果,因为我们最好在宏定义值时加上括号,这样写:
注意:宏定义中可以有非数字字母字符。
宏定义从定义开始(无论是在全局还是函数中)立即生效,直到代码结束。如果想提前终止宏定义,可以用预处理指令undef。
部分资料称宏定义必须在函数之外,测试发现多款编译器无此限制,使用时请确定编译器允许函数内宏定义。
undef对有参宏无参宏均有效,undef用法为:
#undef 宏名
例:
宏仅仅是简单的替换,为什么还需要宏,不直接写替换的结果?宏定义用处很多,比如替换功能,如果你的代码里有100个3.14,当需要把3.14提升精度改为3.14159时,需要把100个3.14全部改过来,增加了代码维护难度,如果使用宏定义,仅仅将宏#define PI 3.14改成#define PI 3.14159即可。宏定义具有增强代码可读性、配合条件编译时使代码灵活等功能,实际开发中经常使用。随着学习的深入,会发现宏的用处。
宏定义由于定义的是常量,所以如果宏定义值的整数值可以用来当作数组长度。
下面给出一个关于宏的简单的例子:
效果类似:
效果图仅供参考。