C语言中的宏与函数

在本节中,我们将看到C中的宏和函数之间的区别是什么。宏是经过预处理的,因此这意味着所有宏在编译时都将进行预处理。这些函数不是经过预处理的,而是经过编译的。

在宏中,没有进行类型检查,因此对于不同类型的输入可能会出现一些问题。对于功能,则不这样做。同样对于宏,如果没有正确维护输入,则可能会生成一些无效的结果。请检查以下程序以获取有关该问题的想法。

示例

#include <stdio.h>
#define SQUARE(x) x * x
int sqr(int x) {
   return x*x;
}
main() {
   printf("Use of sqr(). The value of sqr(3+2): %d\n", sqr(3+2));
   printf("Use of SQUARE(). The value of SQUARE(3+2): %d", SQUARE(3+2));
}

输出结果

Use of sqr(). The value of sqr(3+2): 25
Use of SQUARE(). The value of SQUARE(3+2): 11

我们希望函数和宏都执行相同的任务,但是在这里我们可以看到输出不相同。主要原因是当我们将3 + 2作为函数参数传递时,它将转换为5,然后计算5 * 5 =25。对于宏,它正在执行3 + 2 * 3 + 2 = 3 + 6 + 2 = 11。

因此不建议将宏用于以下问题-

  • 没有类型检查

  • 默认调试,因为它们可以轻松替换

  • 宏没有命名空间。因此,如果宏在一个部分中定义,则可以在另一部分中使用它。

  • 宏会增加代码长度,因为在预处理时会在代码之前添加宏。

  • 宏不检查任何编译时错误。