DC言語が開発された時代は、コンパイラ技術は貧弱なものでした。簡単な近道だったのです。沢山の問題を生んでいることが明らかになってきました。そんなわけで、Dにはプリプロセッサはありません。スケーラブルな方法を提供します。シンボルは一度だけimportされます。マクロプリプロセッサのマクロは、Cに強力な機能と柔軟性をもたらしました。欠点もあります:マクロには、スコープの概念がありません。ソースの終わりまでそのまま有効です。違う.hファイルの中であっても、ネストしたブロックであっても構わず乗り越えていきます。思わぬところでマクロが展開される不具合を避けるのが大変になってきます。デバッガはマクロを認識しません。マクロが展開されたあとのコードから生成されたシンボルのみしか知りませんから。マクロはソースコードの直接の字句解析を不可能にします。マクロを変更すると後続のコードのトークン分けは幾らでも変わり得ます。首尾一貫しない使い方ができてしまい、エラーを生みやすくなっています。(この問題の解決として、C++ではtemplateが導入されました。)マクロは、言語の表現能力に関する欠陥を覆い隠すのに使われます。ヘッダの周りにおく"ラッパ"など。文字列定数の変換などをコンパイル時に行います。構文の後方互換性の問題はほぼ全て避けることができるでしょう。両方を生成するためのトリック的なものは不要です。}最適化ルーチンが関数をインライン化します。効率のロスは生じません。組み込みの式となっています。情報に基づいた最適化も可能になります。複数種のポインタなどに対応していません。従ってこの問題とは無関係です。そこでマクロとして実装します。変数を宣言することができません。スタックの溢れをチェックするようにこのコードを書き換える手間を考えてみて下さい。マクロはシンボルテーブルの外側にある存在です。このため、この関数の定義より外にもこのマクロのスコープが広がっています。マクロへの引数は値としてではなく、テキストとして渡されます。()で囲むように気をつけたりする必要がでてきます。マクロはデバッガには見えません。デバッガはマクロ展開後のコードのみを扱えます。}}上であげた問題点を考えてみると:ネスト関数ではDの関数で可能な全ての表現を使うことが出来ます。(コンパイル時のスイッチで変更可能です)ネストした関数のスコープは他の名前と同様のスコープに従います。式の副作用に気を遣う必要はありません。ネストした関数はデバッガにも見えています。Cのマクロ版と同じ高いパフォーマンスが得られます。実体化のスコープで解析を行っているように見えます。マクロに対しミックスインには利点があります:ミックスインは、構文解析済みの宣言を使って構文木の形で置き換えを行います。システマチックでありません。ミックスインは元の言語と同じ言語です。上層の、また別の言語です。独自の式構文や独自の型、独自のシンボル表に独自のスコープ規則などに従っています。ミックスインは部分特殊化による選択をサポートします。マクロはオーバーロードできません。ミックスインはスコープを構成します。ミックスインは構文解析を行うツールと協調性があります。ミックスインに関する意味情報とシンボル表は、デバッガへ渡されます。マクロの場合は情報が失われます。ミックスインはオーバーライド衝突の解決規則を備えています。マクロでは単に衝突するだけです。標準的な方法で自動的にユニークな識別子を持つことが出来ます。マクロでは、トークン処理の小技を使って手動でやらなければならない作業です。一度だけ評価されます。展開されるたびに評価され(邪悪なバグへの道を開き)ます。ミックスインはどんな長さになっても、普通のDのコードと同じように記述できます。//形式のコメントも使えません。etcetc.ミックスインは内部で他のミックスインを定義できます。マクロの中にマクロ定義はできません。