我在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
我不明白为什么这是输出。
答案 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标准的重新扫描和进一步替换部分。 (有关详细信息,请参阅评论)