C预处理程序的起源是什么?


30

C预处理程序已附加到C,但是它的语法与主要语言完全不同:

  • 语法上显着的空格(行尾终止一条语句,宏确定替换列表的开始后的间隔)

  • 基于关键字的块而不是支撑块,elif而不是else if

  • 关键字主导的定义,而不是声明反射的使用,=对于值定义,否

  • 其他字符串语法的提示(#include <>vs #include ""

  • 惰性求值(显然是C的;但是6.10.3.1可以理解为也暗示着宏扩展的特定顺序,在一些重要的地方)

真的看起来根本不像C!从技术上讲,它它自己的语言,但是它一直被用作C的几乎不可或缺的部分,并且它在语法上不与它集成似乎很奇怪。

维基百科没有谈论它的历史。波特兰模式存储库给了它一个提及,但没有详细介绍它是由其他人(而不是C的其他人)设计的。具有C历史的Dennis Ritchie的网站可能有答案,但不幸的是没有不再可用。

宏引擎,它显然已经从运行系统语言,这可以解释非常不同的语义一些差异,但不是视觉设计方面(这也不清楚现代眼光是否本来是打算作为能够在中样的乐趣,其替代系统是否允许,或者它是否仅仅是在功能强大的优化程序之前的一种内联函数的便捷方式)。如果实际上像C一样的语义已经成为起点,那感觉似乎更接近最终成为C ++模板的东西向宏的逻辑发展。但是,没有比语法更具体的证据了。

我们是否有任何记录说明为何采用这种方式设计,或者创作者的影响是什么?



@Mike omg,谢谢,我真的认为站点内容永远丢失了,因为它在存档中没有可浏览的条目。
Leushenko '16

Answers:


17

http://www.jslint.com/chistory.html(Dennis M. Ritchie撰写的“ C语言的发展”):

1972-3年左右发生了许多其他变化,但最重要的是预处理器的引入,部分是在Alan Snyder的敦促下进行的 [Snyder 74],同时也认识到BCPL和PL / I中可用的文件包含机制的实用性。它的原始版本非常简单,仅提供包含文件和简单的字符串替换:#include和#define无参数宏。此后不久,主要由Mike Lesk和John Reiser对其进行了扩展,以将宏与参数和条件编译结合在一起。预处理器最初被认为是语言本身的可选附件。确实,多年来,它甚至没有被调用,除非源程序在开始时就包含特殊信号。这种态度持续存在,并解释了预处理器的语法与其他语言的不完全集成以及早期参考手册中对其描述的不精确性。

从上面引文中链接的[Snyder 74]参考的第4节中的帐户中可以看出,Alan Snyder一直在研究可移植的(今天有人说“可重定向”)C编译器。也许这就是要求预处理器的动机。

但是,我还没有找到有关C预处理程序本身的设计(语言)的任何其他细节。


1
请注意,Snyder是从MIT来到Bell实验室的,MIDAS汇编器的声明为DEFINE,IFDEF和IFNDEF。巧合?
拉尔斯布林霍夫

0

我可能只是补充说,对于汇编语言来说,拥有看起来与CPP非常相似的宏汇编程序预处理器是很常见的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.