#define的奇怪行为

时间:2013-01-31 19:56:16

标签: 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;
}

它产生这个输出:

bash-3.2$ ./a.out
1
0

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

1 个答案:

答案 0 :(得分: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标准的重新扫描和进一步替换部分。 (有关详细信息,请参阅评论)