gcc -E 选项代表什么?

What does gcc -E option stand for?

提问人:Nicolas F 提问时间:3/21/2022 最后编辑:Nate EldredgeNicolas F 更新时间:3/21/2022 访问量:654

问:

根据 gcc 手册,-E 选项仅预处理 .c 源文件,而不运行编译器并仅提供输入文件 (.i)。但是-E代表什么呢?

gcc 命令行参数 命名 cc 助记词

评论

0赞 ForceBru 3/21/2022
我不明白这个问题:正如您所说,手册说“-E 选项仅预处理 .c 源文件,而不运行编译器,仅提供输入文件 (.i)”。因此,此选项代表“在文件上运行预处理器,不要继续编译”。另请参阅 stackoverflow.com/questions/43193798/what-does-gcc-e-mean.c
0赞 HolyBlackCat 3/21/2022
@ForceBru OP 询问词源。通常,单字母开关是它们所做事情的第一个字母。
0赞 ForceBru 3/21/2022
@HolyBlackCat,啊,好吧,有道理

答:

3赞 Nate Eldredge 3/21/2022 #1

总结

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

  • 我从历史证据中得出的最佳猜测是,它代表“扩展宏”。-E

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

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


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

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

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

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

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

看起来,从最早的版本开始,只支持而不是不支持。从那时起,引入了一个选项,但它执行了其他操作(“禁止生成线标记”)。gcc-E-P-P