如何让 gcc 跳过预处理?
How to make gcc skip preprocessing?
我想做一些测试,希望将输入文件直接传递给 c 编译器,而不是进行预处理。我怎样才能做到这一点?谢谢!
如果您不想预处理的源文件是C 源文件foo.c
,则将其重命名为foo.i
。如果它是 C++ 源文件,则
将其重命名为 foo.ii
。这将导致编译器跳过预处理。像往常一样编译,例如
gcc -c -o foo.o foo.i
但是,如果您尝试在不进行预处理的情况下编译包含预处理指令(“#”行)的源文件,则
编译将简单地失败,例如:
$ 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
.
gcc in my machine is a symbolic link to clang
OS X?不管怎样:你可以用 clang
代替上面的 gcc
。
我想做一些测试,希望将输入文件直接传递给 c 编译器,而不是进行预处理。我怎样才能做到这一点?谢谢!
如果您不想预处理的源文件是C 源文件foo.c
,则将其重命名为foo.i
。如果它是 C++ 源文件,则
将其重命名为 foo.ii
。这将导致编译器跳过预处理。像往常一样编译,例如
gcc -c -o foo.o foo.i
但是,如果您尝试在不进行预处理的情况下编译包含预处理指令(“#”行)的源文件,则 编译将简单地失败,例如:
$ 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
.
gcc in my machine is a symbolic link to clang
OS X?不管怎样:你可以用 clang
代替上面的 gcc
。