gcc -E 选项代表什么?

What does gcc -E option stand for?

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

总结

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

  • 根据历史证据,我最好的猜测是 -E 代表“扩展宏”。

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

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


尽管 Stack Overflow 被认为与主题无关,但我认为了解一些历史将有助于解释此选项的名称。

gcc(1) 从更早的 Unix C 编译器继承了它的基本命令行选项。许多版本可以在the Unix Tree archive.

中找到

看起来第一个支持 -E 的版本是 Research Unix V7,大约在 1979 年:cc(1) source, man page source. There was also a -P option that also just ran the preprocessor, but sent the result to a file foo.i instead of to standard output. V6 had already supported -P but not -E: cc(1) source, man page source.

这至少回答了为什么 -E 没有被命名为 -P:因为 -P 已经在使用中。 (并且 -p 也被拿走了,它被用来请求分析。)我发现关于为什么选择 -E 的唯一提示是源代码中相应的标志变量被命名为 exflag.我会冒险猜测这代表“扩展”,因为 -E 所做的基本上是扩展宏。

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

看起来像 gcc,来自 its earliest version,只支持 -E 而不是 -P。从那时起,引入了一个 -P 选项,但它做了其他事情(“禁止生成线标记”)。