本书后面的谜题都是以下面的预处理器语句开头:
#include "defs.h"
在编译程序的时候,预处理器会把这条语句替换为defs.h文件的内容,使得defs.h文件里的定义在程序里生效。下面是defs.h文件的内容:
#include <stdio.h>
#define PR(fmt,val) printf(#val " = %" #fmt "\t",(val))
#define NL putchar (’\n’)
#define PRINT1 (f,xl) PR(f,x1), NL
#define PRINT2 (f,x1,x2) PR(f,x1), PRINT1 (f,x2)
#define PRINT3 (f,x1,x2,x3) PR(f,x1), PRINT2 (f,x2,x3)
#define PRINT4 (f,x1,x2,x3,x4) PR(f,x1), PRINT3(f,x2,x3,x4)
defs.h文件里的第一行代码也是一条include语句,该语句将把C语言的标准I/O函数库(即stdio.h文件)导入到程序里。defs.h文件里的其余内容是一些用于输出的宏。比如说,要想把数值“5”输出为一个十进制整数,就需要用下面的表达式来调用PRINT1宏命令:
PRINT1(d, 5)
这个调用先扩展为:
PR(D, 5), NL
然后再扩展为:
printf(#5 " = %" #d "\t", (5)), putchar(’\n’)
最后成为:
printf("5 = %d\t", (5)), putchar(’\n’)







