【发布时间】:2021-05-10 20:04:19
【问题描述】:
第一个密码:
#include <stdio.h>
int area(int a,int b){
int area1 = a*b;
return area1;
}
int main()
{
int l1 = 10, l2 = 5, area2;
area2 = area(l1,l2);
printf("Area of rectangle is: %d", area2);
return 0;
}
第二个密码:
#include <stdio.h>
// macro with parameter
#define AREA(l, b) (l * b)
int main()
{
int l1 = 10, l2 = 5, area;
area = AREA(l1, l2);
printf("Area of rectangle is: %d", area);
return 0;
}
两个代码的输出相同:矩形面积为:50
我的问题:很明显,C 语言中的宏与函数相同,但宏比函数占用的空间更少(行数更少)。这是使用宏而不是函数的唯一好处吗?因为它们看起来大致相同。
【问题讨论】:
-
通常最好使用内联函数而不是宏。为其他令牌粘贴留下宏。检查这个问题stackoverflow.com/questions/1640344/…
-
尝试将
AREA( x + y, a + b )用作宏和函数... -
Re“空间效率以外的”,由于每次使用都是“内联”,使用宏会占用更多空间。
-
“很明显,C 语言中的宏和函数是一样的”——这不是“显而易见的”,因为它不是真的。采取“更少的行” 并不是优势。那只是打字而已,在任何情况下都不一定正确。
int area(int a,int b){return a * b;}- 一行,没有不必要的变量,类型安全,即使是最普通的优化器也可能内联。您的AREA宏在任何情况下都存在严重缺陷,这也是为什么应避免使用类似函数的宏的一个例子#define AREA(l, b) ((l) * (b))。 -
函数调用曾经更昂贵,而且旧的编译器没有优化它们,所以宏会更有效。当然,在某些情况下,宏会做一些函数不做的事情,例如引用周围范围内的标识符。但是,在现代 C 语言中,静态内联函数通常比宏更受欢迎。