Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使gcc跳过预处理?_C_Clang - Fatal编程技术网

如何使gcc跳过预处理?

如何使gcc跳过预处理?,c,clang,C,Clang,我想做一些测试,并希望输入文件直接传递给c编译器,而不是预处理。我该怎么做?谢谢 如果不希望预处理的源文件是C源文件foo.C,则将其重命名为foo.i。如果它是C++源文件,那么 将其重命名为foo.ii。这将导致编译器跳过预处理。只需像往常一样编译即可 gcc -c -o foo.o foo.i 但是,如果您试图编译包含预处理指令(“#”-行)的源文件而不进行预处理,则 编译将失败,如: $ cat foo.c #include <stdio.h> int main() {

我想做一些测试,并希望输入文件直接传递给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.i之间使用或使用它做一些事情; 否则,您不妨编译
foo.c

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

OSX?无所谓:您可以用
clang
代替
gcc


我认为在兼容
C
的编译器中没有办法做到这一点。您可以查看是否有办法用“不做任何事情”命令替代预处理器。名义上,它类似于
cat
,只是您需要它忽略所传递的大多数选项。这并不容易。这也令人惊讶。如果代码在未通过预处理器运行的情况下仍要编译,则必须意味着预处理器将不执行任何操作,因此不管是否实际使用预处理器。
-fpreprocessed
选项告诉gcc编译器输入文件已预处理。这会抑制大部分预处理任务。@ring0它会抱怨“错误:未知参数:'-fpreprocessed'”Hmmm旧版本?我的工作。。。你如何使用它?请尝试
gcc-Wall-fprecreased myprettyprog.c-o myprettyprog
谢谢!很好,这个问题没有被删除,尽管被否决了,需要用很多词搜索这个问题。我需要在预处理和编译之间拦截我的一个项目,我不想重复一个阶段,因为我需要它的速度。
$ cpp foo.c > foo.i
$ gcc -c -o foo.o foo.i
$ gcc -o foo foo.o
$ ./foo
Hello world