此为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))
宏和函数
时间: 2024-10-05 07:07:19