C++ 由#定义的奇怪行为
我用C++编写了以下代码:C++ 由#定义的奇怪行为,c++,c-preprocessor,C++,C Preprocessor,我用C++编写了以下代码: #include <string> #include <iostream> int const foo = 1; int const bar = 0; #define foo bar #define bar foo int main() { std::cout << foo << std::endl; std::cout << bar << std::endl; } 我不明白为什么
#include <string>
#include <iostream>
int const foo = 1;
int const bar = 0;
#define foo bar
#define bar foo
int main()
{
std::cout << foo << std::endl;
std::cout << bar << std::endl;
}
我不明白为什么这是输出 宏永远不会递归展开 当您编写
foo
时,它首先扩展到bar
,然后由于bar
是一个宏,它会重新扩展到foo
。虽然foo
是一个宏,但由于宏不能是递归的,所以它不会被扩展。然后计算foo
得到它的值:1
这同样适用于条
见此:
以及ISO/IEC 14882:2003(E)16.3.4标准的重新扫描和进一步替换部分。(有关详细信息,请参阅评论)您为什么要这样做(他想把这个嵌入到一些随机的头文件中,让一些人的生活变成地狱。使用宏来重新定义保留字会产生未定义的行为。不太容易理解。这是一个循环引用的宏。我替换了真/假的东西,因为我相信它与问题无关,只会助长向下投票。回滚edit如果你不同意。@phonetagger你对此有引用吗?无论如何,三次扩展显然不止两次。另一次包含一些细节:这是正确答案。请引用ISO/IEC 14882:2003(E)16.3.4重新扫描和进一步替换。哦,等等,我只是为你做的。你可能会提到,宏替换会一直持续到原始宏名称出现时,此时进一步的宏扩展将停止。因此,foo“扩展”到bar,bar“扩展”回到foo,在这一点上过程停止。@phonetagger感谢您的查找!我相信您的话,因为我在这台计算机上没有标准的副本……实际上是Robᵩ 我查过了,但我读到了&你说得对。
bash-3.2$ ./a.out
1
0