【问题标题】:Why use parenthesis on a single value in macro definition?为什么在宏定义中对单个值使用括号?
【发布时间】:2021-01-17 22:38:25
【问题描述】:

我能理解这一点:

#define ADD( f1, f2 ) ( (f1) + (f2) )

我猜你可以写类似的东西

#define TWO (1+1)

避免优先级问题。

但为什么我经常看到这样的东西:

#define TCS34725_ADDRESS (0x29)

在单个值周围加上括号有什么意义吗?

【问题讨论】:

标签: c c-preprocessor


【解决方案1】:

这取决于宏的使用位置。在某些情况下这是有道理的

#define FOO1( f1, f2 ) ( f1 * f2 )
#define FOO1( f1, f2 ) ( (f1) * (f2) ) // recommended

喂食时会给出非常不同的结果

FOO1( 12+12, 13+12)

在 (0x29) 的情况下,这取决于它的使用方式。

【讨论】:

  • 你应该指出#define FOO1( f1, f2 ) ( (f1) * (f2) )是唯一正确的方法
  • 谢谢。您是否介意添加一个示例,其中使用(0x29) 而不是0x29 是有意义的,因为这是我的问题。 “这取决于”对我没有太大帮助:)
【解决方案2】:

0x29(0x29) 都是主要表达式,因此当通过宏转换为字符串文字时,唯一明显的区别是:

#include <stdio.h>

#define A1 (0x29)
#define A2 0x29

#define MKSTR_(x) #x
#define MKSTR(x) MKSTR_(x)

int main(void)
{
    printf("%s\n%s\n", MKSTR(A1), MKSTR(A2));
    return 0;
}

输出:

(0x29)
0x29

如果你只关心数值,那么宏替换文本中常量周围的括号是多余的,可以省略。

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 2011-08-14
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多