如何让gcc跳过预处理?

noi*_*put 3 c clang

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

Mik*_*han 6

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

gcc -c -o foo.o foo.i
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试编译包含预处理指令('#'-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>
      ^
Run Code Online (Sandbox Code Playgroud)

可能您想要做的是编译一个您已经预处理过的源文件,而无需再次对其进行预处理。在这种情况下,首先预处理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
Run Code Online (Sandbox Code Playgroud)

大概你会foo.i在创建它和编译它之间做一些事情。否则你不妨编译一下foo.c

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

操作系统?不管:您可以替换clanggcc在整个以上。

也可以看看