#define WITHBRACKETS (1)
和#define WITHBRACKETS 1
之间的区别是什么?
我在两个同名的地方定义了宏(我知道这可能会导致重新定义警告,但是它们的定义不同。)
因此,当我编译代码库时,为什么编译器会说#define WITHBRACKETS (1)
是#define WITHBRACKETS 1
的不兼容重新定义?
答案 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:不要使用宏(如果你不需要;)。