版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/credolhcw/article/details/54755411
“宏”只是简单的替换
替换 malloc 语句:
格式:
#define MyMacro(a1,a2,...,an) ( STATEMENT )
在C程式中,经常会用到动态申请内存的语句:
(int*)malloc(sizeof(int)*n);
这样写不仅不够美观,而且相对来说不能够直观的反应出申请的空间大小,不如用一个简单的宏定义让代码更加易读:
#define MALLOC(type, size) \
( (type*)malloc(sizeof(type) * (size)) )
替换 函数块:
格式:
#define MyMacro(a1,a2,...,an) ( STATEMENT )
举个例子,要求计算给定的两个整数的最大公因数,算法如下:
int _GCF( int a, int b )
{
/*
* 初始条件:a > b
*/
if( b == 0 ) return a;
else return _GCF(b,a%b);
}
由于初始条件要求“a>b”,可以用一个宏定义加以控制:
#define GCF(a,b) ( (a>b)? _GCF(a,b): _GCF(b,a) )
通过这个宏定义就可以很方便的调用这个功能。
替换 多行函数块:
格式:
#define MyMacro(a1,a2,...,an) \
do { \
STATEMENT 1; \
STATEMENT 2; \
...
STATEMENT n; \
)while(0)
我开始学习算法的时候,碰到一个计算给定整数序列的全排列的题目,代码如下:
int _ALL_RANGE( int *a, int is, int ie, STACK *s, int flag )
{
/*
* a: 给定整数数组的首地址
* s: 存储结果的栈的地址
* flag: 是否打印终端的标志
*/
int i,tmp;
if( is == ie ) {
pushS(s,a); // 结果入栈
if( flag == 1 ) {
打印该结果;
}
}
else {
for( i=is; i<=ie; i++ ) {
swap(a[i],a[is]; // 交换a[i]和a[is]的值
_ALL_RANGE(a,is+1,ie,s,flag);
}
}
}
当时准备调用这个函数的时候,发现传入的参数中栈指针s可能只是个空指针为,因此在发现是个空指针时需要先调用createS()函数构造一个栈。为了让算法更简明没有多余的语句,我采用的宏定义的方式:
#define ALLRANGE(a,n,s,f) \
do { \
if( (s) == null_ptr ) { \
(s) = createS(n); \
} while(0)\
注:为了保持整体风格的一致 } while(0)
后不需要加”;”。