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
选项,但它做了其他事情(“禁止生成线标记”)。
根据 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
选项,但它做了其他事情(“禁止生成线标记”)。