第1个回答 2019-04-30
先说宏和函数的区别:
1.
宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型.
2.
宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的.
3.
宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行时,才调用的.因此,宏占用的是编译的时间,而函数占用的是执行时的时间.
4.
宏的参数是不占内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的.
5.
函数的调用是需要付出一定的时空开销的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的.
现在来看内联函数:
所谓"内联函数"就是将很简单的函数"内嵌"到调用他的程序代码中,只样做的目的是为了避免上面说到的第5点,目的旨在节约下原本函数调用时的时空开销.但必须注意的是:作为内联函数,函数体必须十分简单,不能含有循环、条件、选择等复杂的结构,否则就不能做为内联函数了。事实上,即便你没有指定函数为内联函数,有的编译系统也会自动将很简单的函数作为内联函数处理;而对于复杂的函数,即便你指定他为内联函数,系统也不会理会的。
有点多哈,呵呵,但是比较完整的答案~!
第3个回答 2014-04-25
宏做的是简单的字符串替换,在编译之前用宏体替换宏名。 内联函数首先是函数,会发生参数的传递,在编译之后执行,其次,作为内联函数就是将很简单的函数"内嵌"到调用他的程序代码中. 宏的原理是替换。 如 #define MY(a,b,c) ((a)*(b)+(a)*(c)+(b)*(c))*2 int main() { int i; i=MY(5,6,7); printf("%d",i); return 0; } 会当作 int main() { int i; i=((5)*(6)+(5)*(7)+(6)*(7)); printf("%d",i); return 0; } (注意:代码在函数内执行(包括参数的代码)) 内联函数是函数。 函数是把参数在内存里传递。 如 #define mul2(a,b) ((a)*(b)+(a)*(b)) ... mul2(i++,j++); ... i++和j++运行了两次! inline int mul2(int a,int b) { return a*b+a*b; } ... mul(i++,j++) ... 他们仅执行了一次! 宏的好处是可以举一反三! 内联函数的好处是不会产生大量代码。