このところ社外のソースを読んでいて、こんなものをみつけてしまいました。
C のヘッダファイルなのですが。
typedef struct { int a; /* ほにゃらら */ int b; /* ほげふが */ } SomeType; typedef struct { int a; /* ほにゃらら */ int b; /* ほげふが */ } SomeType_TEMP; typedef struct { int a; /* ほにゃらら */ int b; /* ほげふが */ } SomeType_HOGE; ...
実際は構造体自体がとっても大きいです。なので最初なにが起きてるのかわかりませんでした。おや、いつのまにスクロールしてしまったかな、みたいな。でもそうではなくて、まったく、コメントまでそっくり同じ構造体がいくつもいくつも、少しずつ違う型名で typedef されてるのですよ。なにかの間違いじゃないかと思って構造体内部を別ファイルに切り出して diff とったら完璧に一致したので空白の数までぴったり一緒です。そしてなにやら型名のサフィックスのところの変化しているところが用途を表わしているように見えたので、おそるおそるソースファイルのほうを開いてみると、そこにはこういうものが……。
SomeType *someVariable; SomeType_TEMP *someVariable_temp; ... SomeType_HOGE * someVariable_hoge;
キャーーーー!!
かつて #define CONSTANT_100 100をみた時にはどちらかというと笑いがこみあげてきましたが、今回は戦慄が走りました。なぜならこれからこのソースを自社のフレームワーク上に移植しないといけないんです。前途多難、お先まっくらです。しかも数万行あるんです。1000行読む毎に新しい発見があります。知らずに済めばそれに越したことのない発見が……。コーヒーの消費量と独り言(主に愚痴)が増えました。
多分これを書いた人は、変数の宣言と型の定義の区別がついてなかったんでしょうね。記憶領域を確保するために毎回型を定義しないと、とか……。ありえねぇ。
これはまだ(衝撃度は大きいけど、コード解析上の障害としては)序の口で、ほぼ全ての変数がグローバル変数、しかもファイルまたぎ、どう考えても不正っぽいキャスト、数行毎に入り乱れる #ifdef の嵐……。読みこなす自信がどんどん削られていっています。もうだめぽ。