惧留孙网

juliusun.com

在线教程 > C语言教程 > 预处理指令之define

预处理指令之define

第 42/50 节 冥河C语言教程


预处理指编译之前所做的工作。预处理先于编译执行。由于在编译之前执行,所以预处理不属于语句。

C语言中一般将预处理命令称作指令,我们下面仍然这样称呼。有的资料上就称作命令,也不要感到陌生。

预处理以#号开始,且#号必须是所在行第一个非空白字符(部分资料上讲#号必须是行第一个字符,尽量放在行首)。#号后面跟指针名,常用的指令如define、include。再后面根据指令不同有所不同。

预处理要单独占用一行。行内有预处理指令,其它预处理指令及C语言语句请换行书写。

不同预处理指令使用方式大不相同,本教程会一个一会介绍。

由于预处理不属于语句,所以预处理不必以分号结尾。

本节着重介绍预处理的define指令。预处理指令define用来定义宏。使用define指令的预处理命令也被称为宏定义。

预处理define指令用来定义常量。常量值一旦定义,在整个有效周期内,不允许改变。

define指令分无参和有参两种用法,无参宏定义用法如下:

#define 宏名 宏值

宏名命名规则遵循标识符定义标准。

宏定义指令define,预处理时,就是简单的替换,凡是代码中写宏名单独的地方(字符串内除外),全部原样替换成宏值。

习惯上,宏名全部大写。这并不是规定,开发及学习者随意。

例:


  1. #define PI 3.14 //宏定义预处理指令,定义宏名为PI,宏值为3.14
  2. printf("%f", PI ); //直接将PI替换为3.14,即同printf("%f", 3.14 );
  3. #define HELLO "hello" //宏定义预处理指令,定义宏名为PI,宏值为3.14
  4. printf(HELLO ); //直接将HELLO替换为"hello",即同printf("hello" );

注意:宏定义不必分号结尾,不必说明类型。宏定义是预处理,先于编译执行,仅仅将代码中的宏名替换为宏值,就是简单的替换作用。

预处理宏定义的替换时,也称宏代换、宏展开。

#define定义有参数的宏格式为:

#define 宏名(参数1,参数2,……,参数N) 带有参数的宏值

参数也必须是合法的标识符。

例:


  1. #define ADD(a,b) a+b //有参宏ADD,可以实现两个数相加的计算
  2. printf("%d", ADD(3,2) );//直接将ADD(3,2)替换为3+2,3对应宏定义里的a,2对应b,即同printf("%f",3+2 );

上面的例子能简单的说明有参宏使用方法,注意有参宏参数同样不需要类型。有参宏也是简单的替换。如果考虑到运算符优先级,上面的代码有个漏洞。例:


  1. #define ADD(a,b) a+b //有参宏ADD,可以实现两个数相加的计算
  2. printf("%d", ADD(3,2)*ADD(3,2 ); //替换结果为printf("%d",3+2*3+2);

考虑到乘号运算符*优先级高于加号运算符+,那么3+2*3+2相当于3 + (2*3) +2,不是想要的结果,因为我们最好在宏定义值时加上括号,这样写:


  1. #define ADD(a,b) (a+b) //有参宏ADD,可以实现两个数相加的计算
  2. printf("%d", ADD(3,2)*ADD(3,2 );//替换结果为printf("%d",(3+2)*(3+2) );这样就没有问题了

注意:宏定义中可以有非数字字母字符。

宏定义从定义开始(无论是在全局还是函数中)立即生效,直到代码结束。如果想提前终止宏定义,可以用预处理指令undef。

部分资料称宏定义必须在函数之外,测试发现多款编译器无此限制,使用时请确定编译器允许函数内宏定义。

undef对有参宏无参宏均有效,undef用法为:

#undef 宏名

例:


  1. #define PI 3.14 //宏定义预处理指令,定义宏名为PI,宏值为3.14
  2. printf("%f", PI ); //直接将PI替换为3.14,即同printf("%f" 3.14 );
  3. #undef PI //从此行起终止宏名PI的使用
  4. printf("%f", PI ); //错误,PI在上一行已经失效,编译器一般会提示PI为未定义的标识符

宏仅仅是简单的替换,为什么还需要宏,不直接写替换的结果?宏定义用处很多,比如替换功能,如果你的代码里有100个3.14,当需要把3.14提升精度改为3.14159时,需要把100个3.14全部改过来,增加了代码维护难度,如果使用宏定义,仅仅将宏#define PI 3.14改成#define PI 3.14159即可。宏定义具有增强代码可读性、配合条件编译时使代码灵活等功能,实际开发中经常使用。随着学习的深入,会发现宏的用处。

宏定义由于定义的是常量,所以如果宏定义值的整数值可以用来当作数组长度。

下面给出一个关于宏的简单的例子:


  1. #include<stdio.h>
  2. #define PI 3.14 //定义无参宏
  3. #define CIRCLE_AREA(r) (PI*r*r) //此有参宏使用了以前定义的无参宏,宏值加上了括号排除运算符优先级方面的干扰
  4. int main( )
  5. {
  6. float f = 1.5; //记录圆的半径
  7. printf("半径为%f的圆面积为%f", f , CIRCLE_AREA(f)); //使用有参宏
  8. getchar( ) ; //使程序暂停一下
  9. return 0;
  10. }

效果类似:

Pic

效果图仅供参考。

作者:冥河 QQ:3304576112
交流QQ群:554701039 C语言讲课群
本教程内容由本站保留版权,请勿复制传播
抖音
©2015-2024 惧留孙网 juliusun.com

京ICP备15039193号-1

首页 教程 下载 文章 聊天 我的