>>81
Dではありがちなプリプロセッサの用途ごとに代替の手段を用意している。

・ 定数の宣言
const int BUFSIZE = 4096 ;
とかenumを使う。

・ 短く汎用的なロジックの定義(min/maxとか)
inline関数を使う。

・ ジェネリックプログラミング(複数の型で同一のアルゴリズム)
templateを使う。

ここまではC++と同じで、C++では推奨だったことがDでは必須になっている。

・ #ifdefによる条件コンパイル(デバッグ用のコード)
debug文という機能を使う。

・ #ifdefによる条件コンパイル(機種依存の処理)
機種依存コードをひとつのモジュールに入れて、そのモジュールを機種ごとに置き換える。

・ #includeで他のモジュールを引用する
import文。

プリプロセッサで処理すると、コンパイルエラーがわかりにくかったりデバッガ
が使えなかったりするが、上記のように言語仕様の中に組込めばそういう問題は
ない。

これ以外の変てこなプリプロセッサの使い方は、わけわからんソースになるから
D言語では禁止。

C#ではこのあたりをどう考えているのか、誰か詳しい人解説してくれ。