Home / ぼやきごと / 2012-06-02
2012-06-02

C++:型のサイズ(sizeof)はプリプロセス時には使えない

sizeof 演算子の値は基本的にコンパイル時定数です。*1
プリプロセス時定数ではありません。

例えば「int 型が2バイトの環境にも対応しよう!」とか今時考えなくてもよさそうなことを考えて次のように書いてもコンパイルが通りません。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
 
 
 
 
 
 
 
#if sizeof(int) == 4
typedef int int32_t;
#elif sizeof(long) == 4
typedef long int32_t;
#else
#error int32_t cannot be defined.
#endif

プリプロセス処理は型の解析を行うよりも前に行われます。
なので sizeof(int) などと書かれていても、それは例えば abcxyz だとかのよくわからない文字列が書かれているのと同じです。

ちなみに上述のような処理を実現するには climits ヘッダ(C言語では limits.h ヘッダ)の中で定義されている定数を用います。

すべて開くすべて閉じる
  1
  2
  3
  4
  5
  6
  7
  8
  9
 
 
 
 
 
 
 
 
 
#include <climits>
 
#if INT_MAX == 0x7FFFFFFF
typedef int int32_t;
#elif LONG_MAX == 0x7FFFFFFF
typedef long int32_t;
#else
#error int32_t cannot be defined.
#endif

int 型が2バイトの環境では INT_MAX == 0x7FFF なのでこれでうまくいくはずです。
また、 configure ファイル等によって各環境に則した定義を生成する方法も(主にLinuxなどで)よく用いられています。

環境によって定義を変える必要があるようなコードを書かないのが一番ですけどね。

Category: [プログラミング][C++] - 2012-06-02 03:51:52

*1 コンパイル時にサイズが確定しない場合は実行時定数になります。