若有以下程序
#include <stdio.h> #define N 2 #define M N + 1 #define NUM (M + 1) * M / 2 main() { printf("%d\n", NUM); }
程序运行后的输出结果是?
有如下宏定义:
#define foo (4 + foo)
按一般的理解,(4 + foo)会展开成(4 + (4 + foo)),然后一直展开下去,直至内存耗尽。但是,预处理器采取的策略是 只展开一次 。也就是说,foo只会展开成(4 + foo),而展开之后foo的含义就要根据上下文来确定了。
对于以下的交叉引用,宏体也只会展开一次。
#define x (4 + y) #define y (2 * x)
x展开成(4 + y) -> (4 + (2 * x)),y展开成(2 * x) -> (2 * (4 + y))。