代码之家  ›  专栏  ›  技术社区  ›  Daniel Muñoz

C[重复]中类宏函数的语法

  •  0
  • Daniel Muñoz  · 技术社区  · 2 年前

    在网络上,我读到,要定义一个行为像函数的宏,语法是:

    #define foo(x,y) (bar((x),(y)))
    
    

    但是考虑到宏只是文本替换,为什么要使用上面的语法,而不仅仅是 (bar(x,y)) bar(x,y) ?

    如果我写

    #define add0(x,y) ((x)+(y))
    
    #define add1(x,y) (x+y)
    
    #define add2(x,y) x+y
    
    

    所有三个宏输出 3 打印时。

    1 回复  |  直到 2 年前
        1
  •  4
  •   kkocdko    2 年前

    The need for parentheses in macros in C

    C macros and use of arguments in parentheses

    不使用括号进行书写可能会导致意外的运算符优先级问题。

    考虑以下示例:

    #define add2(x,y) x+y
    

    如果您调用add2(1,2)*3,它将扩展到1+2*3,即7,而不是9。这是因为在C和C++中,乘法运算符的优先级高于加法运算符。

    但是,如果将宏定义为:

    #define add0(x,y) ((x)+(y))
    

    现在很好。