#if ディレクティブで sizeof が使えない。

規格票( ISO/IEC 14882:2003 もしくは JIS X 3014:2003 )の 16.1.4 によると #if ディレクティブの条件式は先立って 5.19 の規定に従って評価されることになっているわけですが、この 5.19 は定数式の定義に関する項目であり当然の如く sizeof 演算子が含まれています。以前、demicpp を開発するにあたりプリプロセスの仕様を調べてて、この仕様を知ったときには「んなことまでやっとれるか!」と思ったものですが、ほとんどのコンパイラメーカーも私と同様な感想を抱いたのか、#if ディレクティブで sizeof を使うコードを書いて試してみたところ、以下のような結果になりました。

コンパイラ 結果
Borland C++ 5.2 OK
Visual C++ 8 NG
gcc 3.4.4 NG
Intel C++ Compiler 7.1 NG
Open Watcom C/C++ 1.5 NG
Digital Mars C++ 8.49 NG
CodeWarrior 8.0 NG

唯一 Borland が正しく処理してるだけで他は見事に惨敗です。逆に Borland は手元でいつでも用意してる環境の中では一番古い環境(Win95 向けのコンパイラ)でも正しく処理してくれました。Borland だけはずっと以前のバージョンでも大丈夫かもしれません。

しかしまぁ、実際のところこの件に関しては仕様(規格票)が間違っていると思います。C言語との互換を謳う以上、仕方がないことだったのかもしれませんが、んなことまでプリプロセスに求めんなよと。