c - 为什么我们应该或不应该更喜欢接受参数的宏而不是做同样工作的函数?

标签 c function macros arguments c-preprocessor

以下是两个程序,当半径作为参数传递时给出圆的面积。但是在第一个程序 ma​​cro.c 中,我使用了一个宏来完成这项工作,而在第二个程序 function.c 中,我使用了一个函数来完成这项工作。

我熟悉函数的使用及其细微差别。但是接受参数的宏呢?我们什么时候应该更喜欢它们而不是功能?我们什么时候应该避免它们?哪一个性能更好?我知道如果在程序中多次使用宏,宏方法会导致代码庞大,而对于函数,同一个函数会被多次调用。但除了这个微不足道的差异之外,我们还需要注意哪些其他问题?

//macro.c

#include<stdio.h>
#define AREA(x) (3.14*x*x)

int main(void)
{
    float r1=6.25,r2=2.5,a;

    a=AREA(r1);
    printf("\nArea of circle=%f",a);
    a=AREA(r2);
    printf("\nArea of circle=%f",a);
}


//function.c

#include<stdio.h>
float area(float);

int main(void)
{
    float r1=6.25,r2=2.5;
    printf("\nArea of circle=%f",area(r1));
    printf("\nArea of circle=%f",area(r2));
}

float area(float radius)
{
    return 3.14*radius*radius;
}

最佳答案

宏的一些反面:

  • 使用宏,您将失去所有类型安全。传递的参数不会像 inline 函数那样进行类型检查。
  • 由于宏是纯文本替换,它们可能会产生副作用
  • 一个宏可能会被多次计算并导致错误。

因此最好避免使用它们,而是使用 inline 函数。

内联 函数确实有它们自己的另一面:

  • 不保证它们每次都被内联

但考虑到比较,inline 肯定比宏得分高。

关于c - 为什么我们应该或不应该更喜欢接受参数的宏而不是做同样工作的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16433133/

相关文章:

Emacs 元编程,动态定义方法

netbeans - 如何在 Netbeans 中运行宏

C代码片段解释

java - 在 Java 中使用 for 循环打印特定模式

python - 收集有关基本抛硬币猜测程序未按预期运行的用户输入的功能

C函数输入字符串

clojure - 宏调用的函数中参数的求值

C、string和int的sprintf和 "sum"

c - 为什么我们不能在不使用大括号的情况下在 switch case 冒号之后声明变量?

c - 从字符串中获取最后一个单词