在本节中,我们将看到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。
因此不建议将宏用于以下问题-
没有类型检查
默认调试,因为它们可以轻松替换
宏没有命名空间。因此,如果宏在一个部分中定义,则可以在另一部分中使用它。
宏会增加代码长度,因为在预处理时会在代码之前添加宏。
宏不检查任何编译时错误。