首页 > 代码库 > 宏和函数

宏和函数

此为C语言的基础,和Linux内核关系并不大,不过还是作为补充知识点介绍一下好了。宏非常频繁的用于执行简单的计算,比如在两个表达式中寻找其中较大的一个:

#define MAX(a,b) ((a)>(b)?(a):(b))

如果使用函数来实现的话就比较慢,宏的话在编译的时候就完成工作,所以使用宏远比使用函数调用效率来的可观。和使用函数相比,使用宏的不利之处就在于每次使用宏的时候,一个宏定义代码的拷贝就插入到程序中,这样会增加程序的长度。除非非常的短,否则使用宏可能大幅增加程序的长度。

1.宏的副作用,就拿上面MAX举例

#define MAX(a,b) ((a)>(b)?(a):(b))
int x=5;
int y=8;
int z=MAX(x++,y++)
printf("%d %d %d\n",x,y,z);

输出结果是:6,10,9

和往常一样,只要检查一下宏替换代码如下:

z=((x++)>(y++)?(x++):(y++));较大的数会增加两次哎!


2.#define需要注意的地方

  • #define name stuff

如果stuff比较长,每行的末尾要加上\。

#define DEBUG_PRINT printf("string:%s,"						"x=%d,y=%d,z=%d",						"hello",x,y,z)
int main()
{
	int x=1,y=2,z=3;
	DEBUG_PRINT;
	return 0;
}

我们利用了相邻的字符串会自动连接为一个字符串的特性。

  • #define name(param-list) stuff
比如#define SQUARE(x) x*x
这里有个问题:a=5,SQUARE(a+1)就有问题。乍一看没啥问题,觉着会输出36,但是结果却是11.想知道为什么?宏替换如下:a+1*a+1=11。解决方法就是给宏加上括号
#define SQUARE(x) (x)*(x)
我们再看另外一种情况
#define DOUBLE(x) (x)+x(x)
10*DOUBLE(2)得到多少?本来我们想得到的结果是:40,但是实际结果却是22
所以改为:#define DOUBLE(x) ((x)+(x))