コードじぇねれーと2

前回、C#によるmix-in作成や描画クラス作成など、ソース作成プログラムの例を紹介した訳ですが、実はこれには重大な問題があります。コードジェネレートでは一般的に、生成元ソースに何らかの操作をして新たなソースを作成するわけですが、そうすると生成後のソースに手を入れても生成元のソースにはその変更が反映されません。しごく当たり前なことですが、これが結構困るのです。

たとえば生成後のソースがケアレスミスコンパイルに通らなかったとします。もちろんコンパイルに通すため生成後のファイルをいじっていくわけですが、コンパイルに通した後はそれと同じコードを出力させるために生成元のソースを変更する必要があります。つまり、生成後のソースでいじった場所をすべて覚えておく必要があります。1・2ヶ所ならいいのですが、10〜20となるとやってられなくなりますし、また変更した後に間違えてソースの再作成を行うと今までの苦労がすべて水の泡となります。自分の気づかないうちに生成先ソースを変更していたりすると悲惨なことになります。

こういった問題があるので、ファイルのバックアップを取ったり「このソースは自動生成されています。編集しないでください。ヽ(`Д´)ノ」といったメッセージを残すのですが、これでは問題の本質は何も解決されません。何が足りないかというと生成先のソースを変更したら、その変更が生成元に反映されるようなメカニズムです。特に前回見たような、ソースをまんまコピーするようなソース作成ではこの機能があるととても幸せになれます。

実はこの機能、C#にこそありませんがcppやcにはあります。そう、おなじみのマクロです。