博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言中的#define宏定义 求一…
阅读量:4071 次
发布时间:2019-05-25

本文共 1531 字,大约阅读时间需要 5 分钟。

C语言有很多预编译关键字,如#if、#include、#else……,所有以#开头的的关键字都属于这一类,此处讨论#define关键字

 

#define的核心就是“替换

如#define MAXLEN (int)20 语句,在代码中凡是遇到MAXLEN字符串都用,(int)20替换。如源代码中b = c / MAXLEN;实际在预编译阶段将会把做替换编程,b = c / 20;来编译。

如下例代码: 

 

[cpp:showcolumns] 
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  1. #include <stdio.h>  
  2.   
  3. #define MAXLEN (int)20  
  4. #define MAX(a,b) ((a)>(b))?(a):(b)  
  5. #define MIN(a,b) (a<b)?a:b  
  6.   
  7. int main(void 
  8.  
  9.     int a[MAXLEN];  
  10.     int i,maxvalue,minvalue;  
  11.   
  12.     srand(0x45623);  
  13.     for(i 0; MAXLEN; i++)  
  14.         printf("%d ",a[i] rand());  
  15.   
  16.     maxvalue =minvalue a[0];  
  17.     for(i 1; MAXLEN; i++)  
  18.      
  19.          maxvalue MAX(maxvalue, a[i]);  
  20.          minvalue  MIN(minvalue a[i]);  
  21.      
  22.   
  23.     printf("/nMaxValue %d/nMinValue %d/n",maxvalue,minvalue);  
  24.   
  25.     return 1;  
  26.  

 

 

例代码实现的是随机生成一组整形数,然后找出其中最大和最小值,最后打印出这组整形数和最大、最小值。

其中用了3个宏定义,分别定义了数组长度MAXLEN,两个数最大值计算MAX(a,b)和两个数最小值计算MIN(a,b)。

首先,说MAXLEN宏,定义了MAXLEN后,在数组定义、循环范围限定都用到了带来个方便,当某天想要把数组长度改成200、3000、50……时,只需要简单的修改MAXLEN宏定义就搞定了。还有一个功能就是解释说明作用,读代码的人看到这个宏马上就能明白这个地方是要说明数组的长度。

再来,看MAX宏,这是#define的另一个用法 宏函数,可以传递参数,但是它的核心还是替换,MAX(c,f)预编译后会成为((c)>(f))?(c):(f),当我们需要更改这个功能时,可以通过更改这个宏更改,不需要在用这个功能的地方一一修改,这样容易出错。

 

最后MIN宏,和MAX宏的区别是内部参数没有加小括号,这中情况可能在有些运算符优先级高低的情况下导致与编码者意图不一致的情况,如 #define MUL(a,b) a*b     当代码中这样用时,c = MUL(2+3,2); 会出现错误,意图是 c = 10;而实际c = 8;这只是一个很简单的例子,在实际复杂的程序中,如果出现这种令人困惑的问题,会使人找N多时间的。

 

总结:

1、宏的实现核心是替换;

2、宏有解释说明作用;

3、宏函数(暂且这么叫)参数传递过程中需要注意运算优先级问题;

4、修改用宏定义实现的功能时,可以只修改一处,所有地方全部修改,不必每个用到这个功能的地方都过一遍,不容易出错;

4、在一个程序中,相同功能的宏最好只有一个,避免出现多个相同功能宏;


 

请多指教

分享到: 
 
 
你可能感兴趣的文章
《数据库系统概论》 第三章 关系数据库标准语言SQL
查看>>
SQL语句(二)查询语句
查看>>
SQL语句(六) 自主存取控制
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
堆排序完整版,含注释
查看>>
二叉树深度优先遍历和广度优先遍历
查看>>
生产者消费者模型,循环队列实现
查看>>
PostgreSQL代码分析,查询优化部分,process_duplicate_ors
查看>>
PostgreSQL代码分析,查询优化部分,canonicalize_qual
查看>>
PostgreSQL代码分析,查询优化部分,pull_ands()和pull_ors()
查看>>
ORACLE权限管理调研笔记
查看>>
移进规约冲突一例
查看>>
IA32时钟周期的一些内容
查看>>
SM2椭圆曲线公钥密码算法
查看>>
获得github工程中的一个文件夹的方法
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>
PostgreSQL查询优化器详解之逻辑优化篇
查看>>
STM32中assert_param的使用
查看>>
C语言中的 (void*)0 与 (void)0
查看>>
vu 是什么
查看>>