【发布时间】:2019-10-07 03:38:06
【问题描述】:
考虑以下代码:
#define A -100
//later..
void Foo()
{
int bar = -A;
//etc..
}
现在,这在我测试过的一些主要编译器(MSVC、GCC、Clang)和bar == 100 上编译得很好,正如预期的那样,这是因为所有这些编译器的预处理器在标记之间插入了一个空格,所以你最终得到:
int bar = - -100;
由于我希望我的代码尽可能可移植,因此我检查了此行为是否由标准定义,但我找不到任何内容。标准是否保证了这种行为,或者这只是一个编译器功能,并且是否也允许使用幼稚的方法(显然不会编译)bar = --100;?
【问题讨论】:
-
如果你想确定,可以
#define A (-100)。虽然没有回答问题:) -
宏的一般规则总是在表达式扩展周围放置括号,在语句扩展周围放置花括号
-
据我所知,如果没有##,您将永远无法用较小的部分创建一个令牌。
-
@chris 是正确的。多字符运算符,例如
--,需要从单独的标记形成标记粘贴。 -
只要您不尝试支持一些 80 年代的 pre-ANSI C 预处理器...
标签: c++ c-preprocessor c++03