gcc-E选项代表什么



根据gcc手册,-E选项只对.c源文件进行预处理,而不运行编译器,只提供一个输入文件(.i(。但-E代表什么?

摘要

  • 此选项早于GCC在编译器上引入,GCC使用相同的命名以实现兼容性。

  • 根据历史证据,我最好的猜测是CCD_;展开宏";。

  • 早期编译器的作者不能称之为-P,因为已经有了-P选项,它也只运行预处理器,但将输出写入.i文件,而不是标准输出。CCD_ 5。

  • 随着时间的推移,-E变得比-P更受欢迎,并且在编写GCC时,它只支持-E而不支持-P


尽管Stack Overflow被认为偏离了主题,但我认为一些历史将有助于解释这个选项是如何得名的。

-E0继承了早期Unix C编译器的基本命令行选项。在Unix树档案中可以找到许多版本。

看起来支持-E的第一个版本是Research Unix V7,大约在1979年:cc(1)源代码,手册页源代码。还有一个-P选项,它也只是运行预处理器,但将结果发送到文件foo.i,而不是标准输出。V6已经支持-P,但不支持-E:cc(1)源,手册页源。

这至少回答了为什么-E没有被命名为-P:因为-P已经在使用了。(也采用了-p,它用于请求分析。(关于为什么选择-E,我发现的唯一提示是源代码中相应的标志变量命名为exflag。我大胆猜测一下,这代表";展开";,因为CCD_ 24所做的基本上是扩展宏。

看来-P最终被弃用,取而代之的是-E。V8仍然支持它,但在手册页中省略了它。V10(大约1989年(包含了两个版本的编译器,cc编译了传统的C,lcc编译了ANSI C。手册页上说cc支持具有预处理器行为的-P,但对于lcc,-P做了其他事情("在标准错误上为所有定义的全局变量编写声明"(。他们都支持-E。在其他方面,至少在最初,32V和BSD都支持这两种技术,但-P会发出一个警告,说它已经过时,应该使用-E

从最早的版本来看,gcc似乎只支持-E,而不支持-P。从那时起,-P选项被引入,但它做了其他事情("禁止生成线标记"(。

最新更新