用括号和无括号定义的宏 - 重定义错误

时间:2017-09-28 18:52:17

标签: c++ c macros

#define WITHBRACKETS (1)#define WITHBRACKETS 1之间的区别是什么?

我在两个同名的地方定义了宏(我知道这可能会导致重新定义警告,但是它们的定义不同。)

因此,当我编译代码库时,为什么编译器会说#define WITHBRACKETS (1)#define WITHBRACKETS 1的不兼容重新定义?

3 个答案:

答案 0 :(得分:8)

预处理器抱怨它是一种不兼容的重新定义,因为它是!

宏是一个令牌,当遇到它时,预处理器会被一个0或更多其他令牌的序列替换。

#define WITHBRACKETS 1将定义一个将被单个其他令牌替换的令牌。

#define WITHBRACKETS (1)将定义一个令牌,由三个其他令牌替换。

那些不兼容的东西。预处理器不知道或不关心它们在源中的语义含义是否相同。所有它关心的是令牌序列。

答案 1 :(得分:3)

有时候添加括号是个好主意,例如:

#define EXAMPLE (1 + 2)

这里的括号对于操作员优先级错误有用... 在您的示例中,编译器表示存在重定义,因为预处理器不知道1(1)相同,它只是看到有两个不同的字符序列。

答案 2 :(得分:2)

简单来说:宏仅仅是文本替代。

如果你有这两个宏:

#define WITH (1)
#define WITHOUT 1

然后这个:

foo( WITHOUT );
foo WITH ;

将扩展为

foo( 1 );
foo (1);

所以这两个定义确实不同。您可以使用gcc上的-E标志来查看预处理后的输出。

PS:不要使用宏(如果你不需要;)。