Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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预处理器的清晰解释吗_C++_C_Gcc_Preprocessor - Fatal编程技术网

C++ 想要一个关于GCC预处理器的清晰解释吗

C++ 想要一个关于GCC预处理器的清晰解释吗,c++,c,gcc,preprocessor,C++,C,Gcc,Preprocessor,读这篇文章时,结尾有一句话: 历史上,许多语言编译器(包括C++和FORTRAN)已经被实现为“预处理器”,它发出另一种高级语言,如C. 不知道预处理器,有没有文档?这是否意味着所有这些语言都将被翻译成C源代码?否。不一定。许多C++编译器,如GCC文档所说,(但不是GCC/G++)产生C代码输出。他们为什么这样做?因此,他们可以利用C编译器可以编译到的所有后端可执行代码(X86、AMD等),通过将C作为目标代码,他们在后端节省了大量低端代码。这类编译器包括原始的Cfront和Comeau C/

读这篇文章时,结尾有一句话:

<>历史上,许多语言编译器(包括C++和FORTRAN)已经被实现为“预处理器”,它发出另一种高级语言,如C.


不知道预处理器,有没有文档?这是否意味着所有这些语言都将被翻译成C源代码?

否。不一定。许多C++编译器,如GCC文档所说,(但不是GCC/G++)产生C代码输出。他们为什么这样做?因此,他们可以利用C编译器可以编译到的所有后端可执行代码(X86、AMD等),通过将C作为目标代码,他们在后端节省了大量低端代码。这类编译器包括原始的Cfront和Comeau C/C++。

现在,“预处理器”一词的含义完全不同,在这里使用起来很混乱。但是,是的,这里它意味着一些编译器将其源代码发送到另一种语言

应该叫它。其中一个例子是(Bjarne Stroustrup自己设计的),它将C++转换为C.<
<> P> > C++中的“预处理器”的正常含义,参见.P/> < P>我认为最好使用“强>源到源的译者< /强>而不是“预处理器”,这使得它在意义上是含糊不清的,但是它也没有错。 基本上,编译器是一种将源代码从高级编程语言翻译成低级语言(例如汇编语言或机器代码)的计算机程序。但问题中的文档说明:

历史上,许多语言的编译器,包括C++和FORTRAN, 已被实现为“预处理器”,它发出另一个高电平 语言,如C

根据这一描述,可以说早期的编译器是作为源到源转换器实现的。翻译器也是预处理器的一种形式,但它不同于程序中使用的预处理器

翻译器是一种计算机程序,用于翻译所编写的程序 在给定的编程语言中转换为功能等效的程序 用另一种语言

现在,来看看程序中使用的预处理器,让我们举一个例子:

#include <stdio.h>// a PREPROCESSOR directive
#包含//预处理器指令
预处理器是一个程序,它在 主编译是进行的,(类似于翻译器)但区别在于它在这里处理名称以#开头的指令

这里的
#include
是一个指令。此指令使预处理器将
stdio.h
文件的内容添加到 这是一个典型的预处理器操作:在源代码中添加或替换文本
在编译之前。

有些语言是通过让编译器生成C代码来实现的,然后由C编译器编译。值得注意的例子包括:

    > C++(在前的C类)-<代码> cFord<代码> C++代码生成C代码。一旦C++支持异常(Stroustrup的更多信息),它就不再实用了,但不是所有C++编译器都使用了这种技术(实际上,我不知道有任何编译器比<代码> cFord那样做了。
  • Yacc被编译成C代码。BISON可以编译成C或C++代码。
  • Lex被编译成C代码。Flex可以编译成C或C++代码,我相信.<
  • Informix ESQL/C将嵌入式SQL转换为纯C
  • Informix 4GL将I4GL源代码转换为ESQL/C,然后使用ESQL/C编译器创建C代码(C编译器创建目标代码和可执行文件),因此它有一个多级编译器(我正在简化一点)

g++当然不会生成C代码输出,clang(编译C++)也不会。我不相信VisualC++的支持——它几乎不支持C。那么你所说的C++编译器是什么?我认为g++曾经做过,也许不再是了。你认为错了。而cFAGE只是“C++编译器”中的唯一一个。cFAID是C++概念的一个快速证明,长期被抛弃,几乎不符合“最不全”的概念。CuMu/C/C++是另一个概念。我不知道是否合理地调用Dart做的“预编译”;这意味着Javascript本身是编译的。当然,大多数Javascript实现都编译到某个虚拟机或其他虚拟机上,有些甚至具有生成某些机器代码的JIT。尽管如此,它似乎在延伸其含义。另外,您已经两次在“预处理器”中漏掉了“ce”。@rici谢谢,我从答案中删除了Dart示例,因为它与问题(关于gcc)无关。更正了输入错误。文档中描述的“预处理器”与您为其指定链接的含义不同。显然,这种预处理器不应该与C预处理器混淆,这是C、C++、Obje- C和Objul-C++语言的一个整体特征。我认为“预处理器”只是作为一个隐喻(我不知道该怎么称呼它),这意味着其他编译器产生了另一种高级语言,如C,与直接生成机器代码的gcc编译器不同,可能我没有说得足够清楚。这正是我的意思。最后一个链接仅供参考,不要混淆短语“预处理器”的正常含义。是的,这就是它的意思(假设“C代码”指的是C源代码)。是的,我刚刚更新了我的问题。谢谢。在阅读了这里的所有答案后,我得到了两点:1。这里的预处理器是指源到源转换器2。GCC现在不使用这种方式,而是生成机器代码directly@DeanChen是 啊好了:)太好了!你在哪里找到这个细节的?链接可以给我吗?@GrijeshChauhan谢谢!!实际上只有