Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由#定义的奇怪行为_C++_C Preprocessor - Fatal编程技术网

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; } 我不明白为什么

我用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;
}

我不明白为什么这是输出

宏永远不会递归展开

当您编写
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