为什么在宏定义中对单个值使用括号?

Why use parenthesis on a single value in macro definition?

我能理解这个:

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

而且我猜你可以这样写

#define TWO (1+1)

以避免优先级问题。

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

#define TCS34725_ADDRESS (0x29)

用括号括住单个值有什么意义吗?

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

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

一起喂食会产生截然不同的结果
FOO1( 12+12, 13+12)

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

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

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