gcc的参数有很多,这里说一个很重要的参数-E。
如果我们只是想把源文件预处理一下,-E就派上用场了。
它能干什么?
(1)把用户定义的所有的预定义#define展开。
举个例子,如果用户有以下代码:
#define Max(a, b) ((a)>(b)?(a):(b))
...
int c = Max(a, b);
经过gcc预处理后,预定义都将展开成如下样子:
int c = ((a)>(b)?(a):(b));
(2)把所有的#include的文件内容加载进来。
假如我们有#include <stdio.h>,预处理后程序会用stdio.h的内容替换掉#include <stdio.h>,
最后的程序中,你将找不到<>这样的include,更多的是#include "/usr/include/stdio.h"之类的。
有了这个,你可以知道a)stdio.h在linux下的存放路径,b)FILE结构体的摸样,c)size_t类型的定义,d)其他很多你想知道的
(3)处理条件编译,将不符合条件的代码段删除。
例如,有代码段:
#ifdef M
printf("M");
#else
printf("NM");
#endif
预处理后程序将变成
printf("M");
(因为没有#define M,其他行位置为空,代码printf("NM")将被删除)
怎么使用?
使用很简单:gcc -E a.c即可
如果想保存结果,就重定向到某个文件吧,如:gcc -E a.c>b.c(之后可对b.c编译:gcc -o b b.c,运行效果同a.c)