如何让gcc跳过预处理?

时间:2015-01-29 05:48:54

标签: c clang

我想做一些测试,并希望将输入文件直接传递给c编译器,而不是预先执行。我怎样才能做到这一点?谢谢!

1 个答案:

答案 0 :(得分:2)

如果您不想预处理的源文件是C源文件foo.c,请将其重命名为foo.i。如果它是C ++源文件那么 将其重命名为foo.ii。这将导致编译器跳过预处理。像往常一样编译,例如

gcc -c -o foo.o foo.i

但是,如果您尝试编译包含预处理指令('#' -lines)的源文件而不进行预处理,那么 编译将失败,例如:

$ cat foo.c
#include <stdio.h>

int main()
{
    puts("Hello world");
    return 0;
}

$ cp foo.c foo.i
$ gcc -c -o foo.o foo.i
foo.i:1:1: error: stray ‘#’ in program
 #include <stdio.h>
 ^
foo.i:1:10: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token
 #include <stdio.h>
      ^

您可能想要做的是编译您已经预处理过的源文件 再次预处理。在这种情况下,首先预处理foo.c,将输出写入foo.i, 然后编译foo.i

$ cpp foo.c > foo.i
$ gcc -c -o foo.o foo.i
$ gcc -o foo foo.o
$ ./foo
Hello world

据推测,你可以在创建和编译之间对foo.i做一些事情,或者对foo.c做一些事情; 否则你也可以编译clang

  

我机器中的gcc是clang的符号链接

OS X?无论如何:在上述内容中,您可以将gcc替换为{{1}}。

See also