CプリプロセッサはCに付属していますが、メイン言語とは完全に異なる構文を持っています。
構文的に意味のある空白(行末でステートメントが終了し、マクロが置換リストの開始を決定した後のギャップ)
ブレースブロックの代わりにキーワードベースのブロック、else if
の代わりにElif
宣言-反映-使用の代わりにキーワード主導の定義、値の定義に=
なし
代替文字列構文のヒント(#include <>
vs #include ""
)
遅延評価(Cの明らかに、ただし 6.10.3.1 は 暗黙的 と同様に読み取ることができますマクロ展開の特定の順序、重要ないくつかの場所)
それは本当にCのようには見えません!技術的にはは独自の言語ですが、それは常にCのほぼ統合された部分として使用されており、統合されないのは非常に奇妙に思われます構文的には。
ウィキペディアはその歴史について語っていません。ポートランドパターンレポジトリ これは合格の言及です ですが、他のC以外の人々によって設計されたという事実以外は詳しく説明しません。Cの歴史を持つデニスリッチーのWebサイトにはおそらく答えですが、残念ながら利用できなくなりました。
マクロエンジンとして、ランタイム言語とは明らかに異なるセマンティクスを持ち、someの違いを説明しますが、ビジュアルデザインの側面は説明しません(これも不明確です) 可能な種類楽しい であると意図されていたのか、それとも「代替」であるのか、それが「ちょうど」であったのか、現代の目にとって強力なオプティマイザの前に関数をインライン化するための便利な方法)。 Cのようなセマンティクスが実際に開始点であった場合、最終的にC++テンプレートになったものにより近いものは、マクロへのより論理的な進化であったと思われますが、これについての具体的な証拠は、構文の場合よりも少なくなります。
なぜこのように設計されたのか、またはクリエイターの影響があったことの記録はありますか?
From http://www.jslint.com/chistory.html ( "The Development of the C Language" by Dennis M. Ritchie):
他の多くの変更は1972年から3年頃に発生しましたが、最も重要なのは、部分的にはAlan Snyder [Snyder 74] の要請によるだけでなく、ファイルの有用性の認識におけるプリプロセッサの導入でした。 -BCPLおよびPL/Iで利用可能な包含メカニズム。その元のバージョンは非常にシンプルで、インクルードされたファイルと単純な文字列の置き換えのみを提供していました:#includeと#define of parameterless macros。その後まもなく、主にMike Leskによって拡張され、次にJohn Reiserによって拡張されて、引数と条件付きコンパイルを含むマクロが組み込まれました。プリプロセッサは元々、言語自体に対するオプションの付属物と見なされていました。実際、何年もの間、ソースプログラムの最初に特別なシグナルが含まれていない限り、それは呼び出されさえしませんでした。この態度は持続し、プリプロセッサの構文と残りの言語との不完全な統合と、初期のリファレンスマニュアルにおけるその説明の不正確さの両方を説明しています。
上記の引用でリンクされている[Snyder 74]リファレンスのセクション4のアカウントから、Alan Snyderがポータブル(今日は「リターゲット可能」と言うかもしれない)Cコンパイラに取り組んでいるようです。おそらく、これがプリプロセッサを要求する動機でした。
ただし、言語としてのCプリプロセッサ自体の設計については、これ以上詳細を見つけることができませんでした。
アセンブリ言語がCPPに非常によく似たマクロアセンブラプリプロセッサを持つことは非常に一般的だったと付け加えます。