Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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
C++ GCC预处理器一次输出和编译,v2_C++_Gcc_Preprocessor - Fatal编程技术网

C++ GCC预处理器一次输出和编译,v2

C++ GCC预处理器一次输出和编译,v2,c++,gcc,preprocessor,C++,Gcc,Preprocessor,就像,我需要一个方法去做 gcc-E-c main.cc-o main.o 在我的编译器上,来自QNX,但基于gcc 4.4.2,使用-save temps只提供程序集文件(而不提供预处理器文件) 如果我像上面的命令一样添加-E,预处理器输出将保存到main.o 我需要一个解决方案,该解决方案在一次调用gcc时使用上述约束进行编译并输出预处理器 在我的编译器上,来自QNX,但基于GCC4.4.2,使用-save temps只提供程序集文件(没有预处理器文件) 对于这样一个旧版本的GCC或任何QN

就像,我需要一个方法去做

gcc-E-c main.cc-o main.o

在我的编译器上,来自QNX,但基于
gcc 4.4.2
,使用
-save temps
只提供程序集文件(而不提供预处理器文件)

如果我像上面的命令一样添加
-E
,预处理器输出将保存到
main.o

我需要一个解决方案,该解决方案在一次调用
gcc
时使用上述约束进行编译并输出预处理器

在我的编译器上,来自QNX,但基于GCC4.4.2,使用-save temps只提供程序集文件(没有预处理器文件)

对于这样一个旧版本的GCC或任何QNX变体,我无法验证这一点。当然 所有的主线GCC版本至少与4.7版本相同,都符合
-c-保存临时文件foo.c
将预处理的源代码保存在
foo.i
中,将程序集保存在
foo.s

但是如果您的QNX GCC 4.4.2就是这种情况,那么有一个解决方法

从您的评论来看,您似乎反对调用 编译器的两个特点是,您不希望在这方面浪费时间 对源代码进行两次预处理。但是你可以调用编译器两次,一次只做预处理, 再次强调,只进行编译,因此我认为这将是一个令人满意的解决方案

您希望的命令行:

gcc -E -c main.cc -o main.o

显示C++编译器的C++源文件。我想这是个失误。 你所追求的结果的配方对你来说是完全不同的 C和C++的< < /P> 对于您想要的C:

gcc -E main.c > main.i && gcc -c -o main.o main.i
g++ -E main.cc > main.ii && g++ -c -o main.o main.ii
< C++ >你想要:

gcc -E main.c > main.i && gcc -c -o main.o main.i
g++ -E main.cc > main.ii && g++ -c -o main.o main.ii
这将写入要保存到的预处理C[C++]输出
main.i[.ii]
然后将预处理的输出传递给编译器 同样适用于C[C++]编译
gcc[g++]
识别该文件 扩展名
.i[.ii]
表示不应预处理的C[C++]源代码。 看见 因此,它不会再次尝试预处理源代码

此解决方案还具有不生成程序集文件的优点,因为
您不需要。

XY问题。使用两个步骤有什么问题?@Olaf需要两倍的时间。编译过程中已经调用了预处理器,那么为什么不可能呢?这不一样。在现代编译器上,预处理和编译不一定有两个截然不同的过程。如果有两个阶段,您很可能不会损失太多性能。但是,如果您正在加速编译,请使用构建工具;它将比您似乎担心的节省更多的时间。根据关于
-E
选项:
(…)和选项之一-c、-S或-E来说明gcc停止的位置-“停止”在一步中并没有留下太多希望。@Barmar:当被要求时,它会作为一种特殊的帮助生成该选项。当它正常运行时,它永远不会生成文本形式。它同时从预处理和C/C++解析将文件解析为内存中的语法树。