4.3 预处理源文件

使用'-E'选项时预处理器可以对源文件产生直接影响。例如下面的文件定义和使用了TEST宏:

define TEST "Hello, World!"

const char str[] = TEST;

如果这个文件名为'test.c'使用下面的命令行可以看到预处理器的影响:

$ gcc -E test.c

1 "test.c"

const char str[] = "Hello, World!" ;

'-E'选项导致gcc运行预处理器并显示宏的扩展输出,然后不编译源代码而直接退出。TEST宏的值直接被输出,产生了字符串const char str[] = "Hello, World!" ;。

预处理器以格式: # line-number "source-file" 插入一行注释用于记录源文件和行号,来帮助调试并让编译器参考这些信息发布错误提示。这些行不会影响程序本身。

查看预处理源文件对于检查系统头文件的作用和系统定义的函数是非常有帮助的。下面的程序包含'stdio.h'头文件来得到printf函数的声明:

include

int

main (void)

{

printf ("Hello, world!\n");

return 0;

}

使用gcc -E预处理文件来查看包含的头文件中的函数声明:

$ gcc -E hello.c

在GNU系统中会产生如下输出:

1 "hello.c"

1 "/usr/include/stdio.h" 1 3

extern FILE *stdin;

extern FILE *stdout;

extern FILE *stderr;

extern int fprintf (FILE * __stream,

const char * __format, ...) ;

extern int printf (const char * __format, ...) ;

[ ... additional declarations ... ]

1 "hello.c" 2

int

main (void)

{

printf ("Hello, world!\n");

return 0;

}

预处理系统头文件通常会产生很多输出。这些输出可以重定向到一个文件中或者使用gcc '-save-temps'选项更方便的存储:

$ gcc -c -save-temps hello.c

运行此命令后,预处理输出会存放在'hello.i'文件中。'-save-temps'选项也会存储'.s'汇编文件和'.o'目标文件用于预处理'.i'文件。