Solaris 64 ビット 開発ガイド

単一ソースコードの実装

32 ビットおよび 64 ビットコンパイルをサポートする単一ソースコードを書く際に役立つ、アプリケーション開発者向けの資源について説明します。

システムインクルードファイル <sys/types.h><inttypes.h> には、アプリケーションを 32 ビット および 64 ビット安全にするために使用できる定数、マクロ、および派生型が含まれています。これらの詳細についてはこのマニュアルでは説明していませんが、その一部はこの章の以降の節および付録 A 「派生型の変更」で説明しています。

機能テストマクロ

<sys/types.h> をインクルードするアプリケーションのソースファイルでは、<sys/isa_defs.h> をインクルードすることによってプログラミングモデルシンボル _LP64_ILP32 の定義を利用できるようになります。

プリプロセッサシンボル (_LP64_ILP32) およびマクロ (_LITTLE_ENDIAN_BIG_ENDIAN) については、types (3HEAD) を参照してください。

派生型

システム派生型は、コードを 32 ビットおよび 64 ビット安全にするのに便利です。これは、派生型自身が ILP32 および LP64 のデータ型モデルに対して安全であるからです。一般に、変更を可能にするために派生型を使用しておくと便利です。後でデータ型モデルが変更された場合に、または異なるプラットフォームに移植する場合に、アプリケーションそのものではなく、システム派生型を変更するだけで済みます。

<sys/types.h> ファイル

<sys/types.h> ヘッダーには、必要に応じて使用される多数の基本的な派生型が含まれています。特に次のものは重要です。

clock_t

システムの時間をクロック刻み (clock tick) で表します。

dev_t

デバイス番号に使用される型です。

off_t

ファイルサイズとオフセット用に使用される型です。

ptrdiff_t

2 つのポインタの減算結果を示す符号付き整数型です。

size_t

メモリー内のオブジェクトのサイズ (バイト単位) 用に使用される型です。

ssize_t

バイト数またはエラーのどちらを返すこともある関数によって使用される「符号付きサイズ」型です。

time_t

秒単位の時間用に使用される型です。

これらの型はすべて、ILP32 コンパイル環境では 32 ビット、LP64 コンパイル環境では 64 ビットになります。

これらの型の一部の使用方法については、「LP64 への変換のためのガイドライン」で詳しく説明しています。

<inttypes.h> ファイル

定数、マクロ、および派生型を定義するために、インクルードファイル <inttypes.h> が Solaris 2.6 リリースに追加されました。これにより、コンパイル環境とは無関係に、プログラマが記述したコードをサイズ指定されたデータ項目と明示的に互換性を持たせることができます。このファイルには、8 ビット、16 ビット、32 ビット、および 64 ビットのオブジェクトを操作するための機構が含まれてます。このインクルードファイルは、ANSI C の原案の一部で、ISO/JTC1/SC22/WG14 C 委員会による現在の ISO C 標準、つまり ISO/IEC 9899:1990 プログラミング言語 - C の改訂案を反映しています。

<inttypes.h> の主な機能は、次のとおりです。

これらについては以降の節で説明します。

固定幅整数型

<inttypes.h> で提供される固定幅整数型には、int8_tint16_tint32_tint64_tuint8_tuint16_tuint32_tuint64_t などの符号付き整数型および符号なし整数型があります。特定のビット数を格納できる最小の整数型として定義される派生型には、int_least8_tint_least64_tuint_least8_tuint_least64_t があります。

これらの固定幅型を無制限に使用しないでください。たとえば、int はこれまでと同様に、ループカウンタやファイル記述子などについて使用でき、long は配列のインデックスに使用できます。固定幅型は、次に示すような明示的なバイナリ表現に使用してください。

uintptr_t とその他の有用なデータ型

<inttypes.h> によって提供されるその他の型として、ポインタを格納するために十分なサイズの符号付き整数型および符号なし整数型があります。これらの型には、intptr_tuintptr_t があります。さらに、intmax_t および uintmax_t という (ビット単位で) 最長の符号付きおよび符号なしデータ型があります。

uintptr_t 型をポインタ用の整数型として使用する方が、unsigned long のような基本データ型を使用するよりも便利です。unsigned long は、IPL32 と LP64 データ型モデルの両方でポインタと同じサイズですが、uintptr_t を使用すると、uintptr_t の定義を変更するだけで異なるデータ型モデルを使用できます。このため、他の多くのシステムに移植が可能となります。またこれによって、C プログラムコード中に意図する処理をより明確に記述することができます。

intptr_tuintptr_t 型は、アドレス計算をする際にポインタをキャストするのに非常に役に立ちます。long または unsigned long の代わりにこれらを使用することができます。


注 –

通常は、uintptr_t を使用してキャストする方が、intptr_t を使用するよりも安全です。特に比較の場合はこの方法が安全です。


定数マクロ

マクロは、定数のサイズと符号を指定するために使用できます。マクロには、INT8_C(c)、...、INT64_C(c)UINT8_C(c)、...、UINT64_C(c) があります。基本的にこれらのマクロは、必要な場合に定数の後ろに lulll、または ull を置きます。たとえば、INT64_C(1) は、定数 1 の後ろに ILP32 の場合は ll を、LP64 の場合は l を付加します。

定数を最大のデータ型にするためのマクロには、INTMAX_C(c)UINTMAX_C(c) があります。これらのマクロは、「LP64 への変換のためのガイドライン」で説明している定数の型を指定するのに非常に役に立ちます。

<inttypes.h> によって定義される制限値

<inttypes.h> に定義されている制限値は、さまざまな整数型の最小値および最大値を指定する定数です。このファイルには、INT8_MIN、...、 INT64_MININT8_MAX、...、INT64_MAX、およびこれらの符号なし定数の、各固定幅型の最小値と最大値が指定されています。

最小サイズ型のそれぞれの最小値と最大値も指定されています。すなわち、INT_LEAST8_MIN、...、 INT_LEAST64_MININT_LEAST8_MAX、...、INT_LEAST64_MAX、およびこれらの符号なし定数です。

サポートされている整数型のうちの最大の型の最小値と最大値も定義されています。これらには、INTMAX_MININTMAX_MAX、およびそれらの符号なしのものがあります。

書式文字列マクロ

printfscanf の書式指示子を指定するためのマクロも <inttypes.h> にあります。これらのマクロは、引数のビット数がマクロ名に組み込まれている場合に、初期指示子の先頭に l または ll を付加することによって引数を long または long long として指定します。

printf(3C) 書式指示子用のマクロは、10 進、8 進、符号なし、16 進の、8 ビット、16 ビット、32 ビット、64 ビットの整数、最小整数型と最大整数型を出力するためのものです。64 ビットの整数を 16 進表記で出力する例を、次に示します。

int64_t i;
printf("i =%" PRIx64 "\n", i);

同様に、scanf(3C) 書式指示子用のマクロが、10 進、8 進、符号なし、および 16 進の 8 ビット、16 ビット、32 ビット、64 ビットの整数、ならびに最小整数型と最大整数型の読み込み用に提供されています。符号なし 64 ビットの 10 進整数を読み込む例を、次に示します。

uint64_t u;
scanf("%" SCNu64 "\n", &u);

これらのマクロは、無制限に使用しないでください。これらは固定幅型と一緒に使用するのが最適な使用方法です。詳細は、「固定幅整数型」を参照してください。