189 8069 5689

c语言中关于宏和内联函数 函数式宏完全可以用内联函数代替

内联函数与宏的区别(C++)

C++中的内联函数提供了宏之上的功能。宏是内联代码的简单实现形式。。不过两者有很大的区别。

专业成都网站建设公司,做排名好的好网站,排在同行前面,为您带来客户和效益!创新互联为您提供成都网站建设,五站合一网站设计制作,服务好的网站设计公司,成都网站设计、成都做网站负责任的成都网站制作公司!

内联函数采用的是值传递,而宏定义采用的是对等替换。这一点非常重要,宏定义没用好,很可能在使用过程中陷入误区。

例如下面这个宏:

#define

MAX(a,

b)

ab?a:b

当我们这样使用宏时,没有什么问题:

MAX(

num1,

num2

);

因为宏展开后变成

num1num2?num1:num2;。

但是,如果是这样调用的,MAX(

17+32,

25+21);

呢,编译时出现错误,原因是,宏展开后变成:17+3225+21?17+32:25+21,Woh,这是什么啊?

所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。

#define

MAX(

(a),

(b)

)

(a)(b)?(a)b)

即使是这样,也不这个宏也还是有Bug,因为如果我这样调用

MAX(i++,j++);

经过这个宏以后,i和j都被累加了两次,这绝不是我们想要的。所以,在宏的使用上还是要谨慎考虑,因为宏展开是的结果是很难让人预料的。而且虽然,宏的执行很快(因为没有函数调用的开销),但宏会让源代码澎涨,使目标文件尺寸变大,(如:一个50行的宏,程序中有1000个地方用到,宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。因此,在决定是用函数,还是用宏时得要小心。

相同点:两者都是在预处理阶段,对代码块,进行替换。。

内联函数和宏定义的区别

内联函数与宏的区别:

传统的宏定义函数可能会引起一些麻烦。

ex:

#define F(x) x+x

void main(){int i=1;F(i++);}

这里x将被加两次。

内联函数被编译器自动的用函数的形势添加进代码,而不会出现这种情况。

内联函数的使用提高了效率(省去了很多函数调用汇编代码如:call和ret等)。

C语言中有内联函数么

应该是c++中才有的,

inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。

表达式形式的宏定义一例:

 #define ExpressionName(Var1,Var2) (Var1+Var2)*(Var1-Var2)

为什么要取代这种形式呢,且听我道来:

1.

首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中被使用的一个主要原因。

2.

这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。

3.

在C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。

4. inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了它的缺点,同时又很好地继承了它的优点。

为什么inline能很好地取代表达式形式的预定义呢?

对应于上面的1-3点,阐述如下:

1. inline 定义的类的内联函数,函数的代码被放入符号表中,在使用时直接进行替换,(像宏一样展开),没有了调用的开销,效率也很高。

2.

很明显,类的内联函数也是一个真正的函数,编译器在调用一个内联函数时,会首先检查它的参数的类型,保证调用正确。然后进行一系列的相关检查,就像对待任何一个真正的函数一样。这样就消除了它的隐患和局限性。

3. inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。

在何时使用inline函数:

首先,你可以使用inline函数完全取代表达式形式的宏定义。

另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。

C语言的宏定义和C++的内联函数有什么意义

提高效率。

这个是主要意义。

要知道

调用一个函数,是需要时间的

而且 耗费不是太小。

在要求效率比较高的情况下,使用宏 或者内联,可以使代码清爽的同时,不降低效率。

内联函数与c++宏相比的优点有哪些

函数内联

用内联取代宏代码

----------------

C++

语言支持函数内联,其目的是为了提高函数的执行效率(速度)。

在C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。

预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、

返回参数、执行return等过程,从而提高了速度。

使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。

对于C++

而言,使用宏代码还有另一种缺点:无法操作类的私有数据成员。

让我们看看C++

的"函数内联"是如何工作的。

对于任何内联函数,编译器在符号表里放入函数的声明(包括名字、参数类型、返回值类型)。

如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。

在调用一个内联函数时,编译器首先检查调用是否正确

(进行类型安全检查,或者进行自动类型转换,当然对所有的函数都一样)。

如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。

这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换。

假如内联函数是成员函数,对象的地址(this)会被放在合适的地方,这也是预处理器办不到的。

C++

语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员。

所以在C++

程序中,应该用内联函数取代所有宏代码,"断言assert"恐怕是唯一的例外。

assert是仅在Debug版本起作用的宏,它用于检查"不应该"发生的情况。

为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。

如果assert是函数,由于函数调用会引起内存、代码的变动,那么将导致Debug版本与Release版本存在差异。

所以assert不是函数,而是宏。


分享文章:c语言中关于宏和内联函数 函数式宏完全可以用内联函数代替
路径分享:http://cdxtjz.cn/article/hhophh.html

其他资讯