请看下面的代码:
考虑以下代码:
#define A -100
//later..
void Foo()
{
int bar = -A;
//etc..
}
现在,我测试了一些主要编译器(如MSVC、GCC、Clang),这些编译器都可以正常编译,bar == 100
,这是因为所有编译器的预处理器在令牌之间插入了一个空格,所以你最终得到的代码是:
int bar = - -100;
由于我希望我的代码尽可能具有可移植性,因此我去检查了一下标准是否定义了这种行为,但我找不到任何相关内容。这种行为是由标准保证的,还是仅仅是编译器的特性?而且,像这样的naive方法(显然不会编译通过)bar = --100;
是否也被允许?
#define A (-100)
。不过这并没有回答问题 :)。 - Zereges--
这样的多字符运算符需要使用标记粘贴才能从单独的标记中形成。 - L. Scott Johnson