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

#if ディレクティブで sizeof が使えない。id:sulpsulpc さんからトラックバックでのご指摘がありました。


JIS X 3014 16.1 p4


マクロ展開及び defined 単項演算子によるすべての置換の実行後、残っているすべての識別子、及び true と false を除くキーワードを前処理数 0 で置き換えてから、各前処理字句を字句に変換する。この結果得られた一連の字句を、制御定数式として5.19の規則に従って評価する。

太字部分を読み飛ばしたのかな。

読み飛ばしてはいなかったのですが、なぜか「これはこれ、それはそれ」と分けて解釈してしまっていました。確かに、これでは定数式として評価される前に sizeof が 0 に置換される為、使えないのが規格的には正しい挙動となりますね。

ご指摘を受けて改めて、ひょっとしたら Borland で sizeof が使えたのはエラーにならなかっただけで、実はまともに挙動しているわけではない?との疑問が浮かび追試を行ったところ、sizeof の評価自体は正しく機能していました。しかも単にユーザ定義の構造体やクラスのサイズまで正確に評価するだけでなくちゃんとクラステンプレートにまで対応してました。いまや落ちに落ちぶれた Borland/CodeGear ですが、コンパイル速度に関してはいまだにダントツでトップな秘訣はこの辺にあるのかもしれませんね。