根据gcc手册,-E选项只对.c源文件进行预处理,而不运行编译器,只提供一个输入文件(.i(。但-E代表什么?
摘要
-
此选项早于GCC在编译器上引入,GCC使用相同的命名以实现兼容性。
-
根据历史证据,我最好的猜测是CCD_;展开宏";。
-
早期编译器的作者不能称之为
-P
,因为已经有了-P
选项,它也只运行预处理器,但将输出写入.i
文件,而不是标准输出。CCD_ 5。 -
随着时间的推移,
-E
变得比-P
更受欢迎,并且在编写GCC时,它只支持-E
而不支持-P
。
尽管Stack Overflow被认为偏离了主题,但我认为一些历史将有助于解释这个选项是如何得名的。
-E
0继承了早期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
选项被引入,但它做了其他事情("禁止生成线标记"(。