带参宏、函数、及内联函数

带参宏即为带有参数的宏定义,要注意的是,在书写带参宏时一定要给每一个参数带括号,并给表达式整体带括号。如求a,b中较大者:

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

众所周知,宏定义是在预处理阶段由预处理器对所定义的宏进行原地展开的,而预处理器是不带参数检验功能的,所以带参宏无法对其参数进行校验,这是它的一个缺陷。同时对它的处理是原地替换,所以不存在传参,也就免去了传参时的资源调度,提高了运行效率,这是它的一个优点。

而对函数的处理是在编译阶段由编译器进行的,编译器带有参数检验功能,可以对函数的参数进行类型静态校验,避免传参错误,与带参宏相比,这是函数的一个优点。同时,函数传参时需要调度资源,降低了程序的运行效率,这是它的一个缺点。

内联函数是通过在函数定义时在函数返回值类型前加inline关键字来实现的,在编译阶段,编译器会在调用内联函数处直接将inline函数原地展开,不存在传参。可见内联函数就结合了函数和带参宏二者的优点与一身,即提高了效率,又具有参数检验。

注意inline关键字只是建议编译器将该函数当做内联函数来处理,当函数体很短时,编译器会考虑其建议,直接将inline函数在调用处原地展开,但当函数体很长,直接展开很费劲时,编译器就不会接受inline关键字的建议,依然将该函数当做普通函数来处理,这时候虽然函数有inline关键字修饰但不会被在调用处原地展开。

猜你喜欢

转载自blog.csdn.net/weixin_39330853/article/details/81870805