C语言中宏与函数的区别

C语言中宏与函数的区别,c,function,macros,C,Function,Macros,我不熟悉C语言。当我学习C语言时,我学习了一种叫做宏的东西。据我所知,宏就像JavaScript中的一个函数,我们可以在需要时调用它。但后来我了解到,在编译程序之后,我调用宏的所有位置都被宏的定义所取代。所以我搞不清楚C语言中宏和函数的区别是什么 我还想知道我是否可以在代码中编写多行宏,以及在编译代码时如何替换它 作为一个例子,假设我想在两个数字中找出最大值 将该进程作为宏编写而不是将其作为函数编写是否是一种良好的做法 使用宏有时是危险的: 你可以在这里读到使用它的危险 但是,对于你的问题: #

我不熟悉C语言。当我学习C语言时,我学习了一种叫做宏的东西。据我所知,宏就像JavaScript中的一个函数,我们可以在需要时调用它。但后来我了解到,在编译程序之后,我调用宏的所有位置都被宏的定义所取代。所以我搞不清楚C语言中宏和函数的区别是什么

我还想知道我是否可以在代码中编写多行宏,以及在编译代码时如何替换它

作为一个例子,假设我想在两个数字中找出最大值


将该进程作为宏编写而不是将其作为函数编写是否是一种良好的做法

使用宏有时是危险的: 你可以在这里读到使用它的危险

但是,对于你的问题:

#include <stdio.h>

#define SUM(X, Y) (X + Y)
void main() {
    printf("the sum of 3,4 is : %d\n", SUM(3,4));
}
一切正常-不要使用宏。一个更好的替代内联函数-它将实现与您期望的相同的效率。但为了好玩,我做了一些工作来使用gcc,这意味着一个以gcc为中心的非可移植解决方案

#include <stdio.h>
#define SUM(X)                           \
    ({  long s = 0;                      \
        long x = (X) > 0 ? (X) : (-(X)); \
        while(x) {                       \
            s += x % 10;                 \
            x /= 10;                     \
        }                                \
        s;                               \
    })
int main(void) {
    printf("%ld\n",SUM(13423) );
    return 0;
}

这个解决方案需要一个函数。使用语句表达式在宏中具有返回某些内容的功能。我说过,使用内联函数。这将以更干净的方式达到目的

最好将参数括在括号中定义SUMX,yx+Y:我不认为这会对结果产生什么影响,但总的来说我接受这个评论。再次,我个人认为以这种方式使用宏是一个不好的isea。内联宏是首选的,至少从我的观点来看,调试这些宏是困难的。。。谢谢这没有给出一个数字的数字之和。@Fredrik-你是对的-我误解了这个问题。据我所知,coderredoc的答案是正确的。。
#include <stdio.h>
#define SUM(X)                           \
    ({  long s = 0;                      \
        long x = (X) > 0 ? (X) : (-(X)); \
        while(x) {                       \
            s += x % 10;                 \
            x /= 10;                     \
        }                                \
        s;                               \
    })
int main(void) {
    printf("%ld\n",SUM(13423) );
    return 0;
}