美文网首页C语言
宏定义函数与内联函数

宏定义函数与内联函数

作者: 风情云 | 来源:发表于2020-03-22 20:55 被阅读0次

宏定义函数

在c程序中,可以使用宏定义函数代替简单的函数,这样提高程序效率,预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、 返回参数、执行return等过程,从而提高了速度。 缺点是使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。

//宏定义函数
#define TEST(a) a*3
int main()
{
    int a = 2;
    int tmp = TEST(a+2);
    printf("tmp = %d\n",tmp);
}

结果

tmp = 8

结果不应该是12吗,这是因为宏定义函数不会处理表达式将a+2的值求出在传值,而是直接宏定义展开,TEST(a+2) =》 a+2*3 不做任何处理,所以结果为8,要解决这个问题就要加在宏定义时括号

#define TEST(a) (a)*3

代码展开变为 (a+2)*3 结果就正确。所以宏定义参数记得加括号。

#define MAX(a,b) (a)>(b)?(a):(b)
int main()
{
    int a = 2;
    int b = 3;
    int max = ++MAX(a,b);
    printf("max = %d\n",max);
}

结果

max = 3

结果又错了,首先展开宏定义看看,
++MAX(a,b) => ++(a)>(b)?(a):(b) 此时() 优先级大,先算括号内的,接着到++,所以a的值为3,结果就为3。解决办法:尝试返回的结果再加一层括号

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

(在c语言中)编译错误,三目运算符的返回值不能作为左值。所以一般宏定义函数不会这样用,宏定义函数返回一个常数,常数不可以作为左值。

#define MAX(a,b) (a)>(b)?(a):(b)
int main()
{
    int a = 2;
    int b = 3;
    int max = MAX(a,++b);
    printf("max = %d\n",max);
}

结果

max = 5

结果为5,为什么?宏定义展开看看:
MAX(a,++b) => (a)>(++b)?(a):(++b) 结果可以明白了,b自增两次,宏定义函数是不会处理传入的值,只会宏定义展开,所以b并没有自增为4再展开。这个有解决方法吗?这个没有。

小结

在使用宏定义函数时,尽量将参数使用括号括起来,这样会先计算参数的表达式,再运行宏定义函数内容,还有尽量不要使用自增自减运算符,结果可能不可预测。宏定义函数返回常数,不可作为左值。

内联函数

在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展)。这个也和宏定义函数有一样的优点,没有压栈,弹栈的开销,效率会较高。

//定义内联函数
inline void test()
{
    printf("test\n");
}

定义内联函数只需在函数定义前加“inline”关键字,注意在声明函数的加关键字并不没有定义成内联函数,要在定义时加上才可以。内联函数是在运行时直接展开函数体,所以在一些场景最好不要使用内联函数:
1.存在循环体
2.函数体比较大
3.递归函数
总之就是函数体内部需要开辟大量内存的函数不适宜定义为内联函数,会消耗大量内存,耗费时间也长。

两者不同

宏定义函数的展开是在预编译阶段,内联函数是在编译阶段。宏定义函数不会检查语法错误,而内联函数会。宏定义与参数数据类型无关,而内联函数有关。


微信号

相关文章

  • 宏定义函数与内联函数

    宏定义函数 在c程序中,可以使用宏定义函数代替简单的函数,这样提高程序效率,预处理器用复制宏代码的方式代替函数调用...

  • 王道程序员求职宝典(十)函数,栈与队列

    函数 参数传递值传递指针传递引用传递指针引用*& 内联函数成员函数内联普通函数内联宏定义 默认参数从右向左设定默认...

  • C/C++知识点分享(29)

    1.宏与内联函数的区别 解析:内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数...

  • 内联函数与宏定义

    内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如:#define MAX(a,b) ...

  • NS_INLINE 内联函数

    1 内联函数与宏定义 C++ 语言支持函数内联,其目的是为了提高函数的执行效率(速度)。在C程序中,可以用宏代码提...

  • Python沙盒逃逸Payload收集(搬运自王一航师傅)

    1.内联函数 关于内联函数,我的理解就是省去函数调用时函数返回地址、参数的压入栈的开销,而采用类似宏定义的代码展开...

  • [C++之旅] 9 内联函数、类内定义与类外定义

    [C++之旅] 9 内联函数、类内定义与类外定义 内联函数:编译时将函数体代码和实参代替函数调用语句。在函数前加i...

  • C++查漏补缺

    1.内联函数 特点:(1)inline 定义 作用:(1)作用类似于宏定义 优点:(1)节省空间 缺点:(1)与全...

  • C++第二弹---函数

    内联函数 内联函数的定义内联函数也叫内嵌函数,他主要是解决程序运行效率。当内联函数收到编译器的指示时,即可发生内联...

  • 内联函数,重载函数,参数默认的函数

    内联函数 内联函数和宏差不多,要是时间不要空间;关键字inline。内联函数中,不能有复杂的控制语句,比如if或f...

网友评论

    本文标题:宏定义函数与内联函数

    本文链接:https://www.haomeiwen.com/subject/thqbyhtx.html