宏和函数

此为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

宏和函数的相关文章

宏、函数和内联

先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的. 3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间. 4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的

宏和函数的区别

先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.2. 宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.3. 宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.4. 宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传

宏和函数的比较(C/C++)

宏和函数及在C/C++中的比较: 1.频繁使用且执行简单的计算可以使用宏,而其他较为繁琐.复杂的程序可以用函数实现. 2.宏定义时与类型无关,而函数需要注意参数的类型等. 3.宏定义的名字全为大写,而函数名则是使用字母和"_"来进行命名. 4.宏参数具有一定的副作用,需注意:"()"的使用,而函数不存在这些问题. 5.在C++中,一般不使用宏(宏函数 --> 内联函数, 宏常亮 --> const .enum). 6.C语言中,宏不能调试,而且没有类型安

C语言宏定义和宏定义函数

要写好C语言,漂亮的宏定义是非常重要的.宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等. 在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义: #define MAX( a, b) ( (a) > (b) (a) : (b) ) 其次,把它用函数来实现: int max( int a, int b)

关于宏定义函数

宏定义函数:在C及C++语言中允许用一个标识符来表示一个字符串,称为宏,该字符串可以是常数.表达式.格式串等.在编译预处理时,对程序中所有出现的"宏名",都用宏定义中的字符串去代换,这称为"宏代换"或"宏展开".宏定义是由源程序中的宏定义命令完成的.宏代换是由预处理程序自动完成的.若字符串是表达式,我们称之为函数式宏定义,那函数式宏定义与普通函数有什么区别呢?我们以下面两行代码为例,展开描述: 函数式宏定义:#define MAX(a,b) ((

iOS 使用宏定义函数和代码块

iOS使用宏定义函数和代码块 今天在开发过程中碰到一个问题:就是父类中要向外发送通知,然后子类中或者其他类中来接收它.当然一般是把它写到类方法中去,但是有个问题,就是如果调用的类不是它的子类,就不能直接调用,当然也可以采用静态方法实现,我这里主要是想用宏定义来实现,下面我分别介绍使用宏定义函数和定义代码块的方式进行,废话不多说了,直接上代码: 使用宏定义函数实现 //定义 #define SendNotification @"SendNotification" #define send

巧妙的运用宏和函数写好你的C代码

究竟是用函数好,还是宏定义好? 比较两个数或者表达式大小,首先把它写成宏定义: eg: #include<stdio.h> #include<stdlib.h> #define MAX(x,y) ((x) > (y)? (a) : (b)) int main() { int a = 2, b = 4; int m = 0; m = MAX(2, 4); printf("%d\n", m); system("pause"); return

c语言中,宏和函数的区别

一.代码长度:宏是完全替换,插入到程序里使得代码变长: 函数代码是只出现在一个地方,使用时则去那里调用. 二.执行速度:宏更快一些,因为在预编译阶段都已完成: 函数则慢一点,因为需要调用以及返回(压栈/出栈)额外时间. 三.操作符优先级:宏有时要少加括号而导致计算逻辑出错: 函数最后只将值返回来,结果容易预测. 四.参数求值:宏每次都要计算: 函数只需要计算一次,之后多次调用并不会导致多次求值而出错. 五.参数类型:宏不关心类型,只要参数操作合法就可以: 函数类型要一致,不同类型则需要不同函数.

总结宏和函数的区别

时间性考虑:(1)宏只占编译时间,函数调用则占用运行时间(分配单元,保存现场,值传递,返回),每次执行都要载入,所以执行相对宏会较慢.(2)使用宏次数多时,宏展开后源程序很长,因为每展开一次都使程序增长,但是执行起来比较快一点(这也不是绝对的,当有很多宏展开,目标文件很大,执行的时候运行时系统换页频繁,效率就会低下).而函数调用不使源程序变长.安全性考虑:(3)函数调用时,先求出实参表达式的值,然后带入形参.而使用带参的宏只是进行简单的字符替换.(4)函数调用是在程序运行时处理的,分配临时的内存