#blog2navi() *C++:型のサイズ(sizeof)はプリプロセス時には使えない [#abbd11f8] @code{sizeof}; 演算子の値は基本的にコンパイル時定数です。((コンパイル時にサイズが確定しない場合は実行時定数になります。))~ プリプロセス時定数ではありません。 例えば「@code{int}; 型が2バイトの環境にも対応しよう!」とか今時考えなくてもよさそうなことを考えて次のように書いてもコンパイルが通りません。 #code(c){{ #if sizeof(int) == 4 typedef int int32_t; #elif sizeof(long) == 4 typedef long int32_t; #else #error int32_t cannot be defined. #endif }} プリプロセス処理は型の解析を行うよりも前に行われます。~ なので @code{sizeof(int)}; などと書かれていても、それは例えば @code{abcxyz}; だとかのよくわからない文字列が書かれているのと同じです。 ちなみに上述のような処理を実現するには climits ヘッダ(C言語では limits.h ヘッダ)の中で定義されている定数を用います。 #code(c){{ #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 }} @code{int}; 型が2バイトの環境では @code{INT_MAX == 0x7FFF}; なのでこれでうまくいくはずです。~ また、 configure ファイル等によって各環境に即した定義を生成する方法も(主にLinuxなどで)よく用いられています。 環境によって定義を変える必要があるようなコードを書かないのが一番ですけどね。 RIGHT:Category: [[[プログラミング>ぼやきごと/カテゴリ/プログラミング]]][[[C++>ぼやきごと/カテゴリ/C++]]] - 2012-06-02 03:51:52 ---- RIGHT:&blog2trackback(); #comment(above) #blog2navi()