为什么在宏定义中对单个值使用括号?
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
如果您只关心数值,那么宏替换文本中常量周围的括号是多余的,可以省略。
我能理解这个:
#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
如果您只关心数值,那么宏替换文本中常量周围的括号是多余的,可以省略。