我们先看看关于宏的的一个小特性:替换文本并不仅限于数值字面常量。使用#define指令,可以把任何文本替换到程序中。
举几个例子:
#define reg register
#define do_for for( ; ; )
怎么样,是不是看起来比较常规,那我们本文的题目到底有什么关系呢?
别急啊,且看看下面这段代码:
#define XIAOHAN \
for(i=0;i<10;i+=1) \
{ \
sum+=i; \
if(i>0) \
prod*=i; \
}
怎么样,是不是看起来没怎么见过,不妨会去尝试一下,看看能不能运行,但是也只是尝试一下就好,可不要被这种技巧迷惑呦,因为接下来我们就要去讨论一下这种方式和函数的优劣!
下面我们直接切入正题
关于宏和函数的不同之处:
1.代码长度:#define在每次使用时,宏代码都被插入到程序中。除了非常小的宏,程序的长度将大幅增长;而函数代码只出现在一个地方,每次使用这个函数时都只调用那个地方同一份代码。
2.执行速度:#define很快;而函数则是存在函数调用和返回的额外开销。
3.操作符优先级(这一点很重要):#define如果想要那找自己预想的顺序进行,请务必要加括号!!!而相对于函数来说,表达式求值更容易预测。
4.参数类型:#define宏与类型无关,只要对参数的操作是合法的,他可以适用于任何的参数类型;而函数的参数时与参数类型有关的,如果参数的类型不同,就需要使用不同的函数,即使功能相同。
怎么样,说到这是不是对宏和函数的区别有了一个相对认识的概念了呢,说到底,大家还是对函数的了解要更加多一些,所以我们不妨从宏的角度粗略的解读一下吧:
宏本身非常的频繁的用于一些简单的表达式计算,比如下面这个例子:
#define MAX(a.b) ((a)>(b)?(a):(b))
像上述功能呢,就不太适合用函数,两点原因:首先,用于调用和从函数返回的代码很可能比实际执行这个小型计算工作的代码体型要大;第二,函数要求参数的类型,若是遇到不同类型的参数,即使是功能相同,改写的函数还是得写。
而宏相对于函数的劣势也是相当明显的:除非宏非常短,否则将会大幅增加程序的长度。