#define的奇怪行为

Jba*_*d26 0 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;
}
Run Code Online (Sandbox Code Playgroud)

它产生这个输出:

bash-3.2$ ./a.out
1
0
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这是输出.

Pub*_*bby 11

宏永远不会递归扩展.

当你写的时候foo,它会首先扩展为bar,然后再bar扩展回宏foo.虽然foo是宏,但由于宏不能递归,因此不会进行扩展.然后评估foo产生其价值:1.

同样的道理bar.

请参阅:http://gcc.gnu.org/onlinedocs/cpp/Self_002dReferential-Macros.html#Self_002dReferential-Macros

ISO/IEC 14882:2003(E)16.3.4标准的重新扫描和进一步替换部分.(有关更多详情,请参阅评论)