デフォルトの 32 ビットコンパイル環境は、派生型およびサイズに関して従来の Solaris オペレーティングシステムリリースと同じです。64 ビットコンパイル環境では、派生型をいくつか変更する必要があります。これらの派生型について、次に示す表で説明します。
コンパイル環境は 32 ビットと 64 ビットとで相違がありますが、両方の環境で同じヘッダー群が使用され、それぞれをコンパイルオプションで適切に定義することができます。アプリケーション開発者がどの選択肢を利用できるかをよりよく理解するには、_ILP32 および _LP64 という機能テストマクロを理解することが役に立ちます。
表 A–1 機能テストマクロ
機能テストマクロ |
説明 |
---|---|
_ILP32 |
_ILP32 機能テストマクロは、int、long、およびポインタが 32 ビット量である ILP32 データ型モデルを指定するのに使用します。このマクロを使用すれば、自動的に従来の Solaris の実装と同じ派生型およびサイズが見えるようになります。これは、32 ビットアプリケーションを構築するときのデフォルトのコンパイル環境です。これによって C および C++ アプリケーションに対するバイナリおよびソースの互換性が保証されます。 |
_LP64 |
_LP64 機能テストマクロは、 |
次のコード例で、コンパイル環境に応じた正しい定義が見えるようになる機能テストマクロを使用する例を示します。
#if defined(_LP64) typedef ulong_t size_t; /* サイズ (バイト数) */ #else typedef uint_t size_t; /* (従来のバージョン) */ #endif |
この例にある定義で 64 ビットアプリケーションを構築する場合、size_t
は ulong_t
または unsigned long
となり、これは LP64 データ型モデルでは 64 ビット量です。32 ビットアプリケーションを構築する場合、size_t
は uint_t
または unsigned int
として定義されます。これは、ILP32 および LP64 のどちらのデータ型モデルでも 32 ビット量です。
#if defined(_LP64) typedef int uid_t; /* UID 型 */ #else typedef long uid_t; /* (従来のバージョン) */ #endif
ILP32 データ型モデルの表現が LP64 データ型モデルの表現と同じであったとしても、これらの例のどちらの場合でも同じ最終結果が得られたはずです。たとえば、size_t
を ulong_t
に、uid_t
をint
に変換したとしても、32 ビットアプリケーション環境ではどちらも 32 ビット量であったはずです。しかし、従来の型表現を維持することによって、32 ビットの C および C++ アプリケーションどうしの整合性と、Solaris の以前のバージョンとのバイナリおよびソースの互換性が保証されています。
表 A–2 に、変更された派生型を示します。_ILP32 機能テストマクロの欄の型は、Solaris ソフトウェアに 64 ビットサポートが追加される前の Solaris 2.6 の型と同じであることに注意してください。32 ビットアプリケーションを作成する場合に利用できる派生型は _ILP32 欄の型です。64 ビットアプリケーションを作成する場合に利用できる派生型は _LP64 欄の型です。これらの型はすべて <sys/types.h> に定義されています。例外は wchar_t
と wint_t
型で、これらは <wchar.h> に定義されています。
これらの表を再確認するときには、32 ビット環境では int
、long
、およびポインタは 32 ビット量である、ということを憶えておいてください。64 ビット環境では、int
は 32 ビット量ですが、long
およびポインタは 64 ビット量です。
派生型 |
Solaris 2.6 |
_ILP32 |
_LP64 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
未定義 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表 A–3 に、大規模ファイルのコンパイル環境に固有の派生型を示します。これらの型は、機能テストマクロの _LARGEFILE64_SOURCE が定義されている場合にのみ定義されます。ILP32 コンパイル環境が Solaris 2.6 と同じであることに注意してください。
表 A–3 変更された派生型 — 大規模ファイルの場合のみ
派生型 |
Solaris 2.6 |
_ILP32 |
_LP64 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表 A–4 に、_FILE_OFFSET_BITS の値に関する派生型を示します。_LP64 を定義し _FILE_OFFSET_BITS==32 に設定して、アプリケーションをコンパイルすることはできません。_LP64 が定義された場合、デフォルトで _FILE_OFFSET_BITS==64 です。_ILP32 が定義されて _FILE_OFFSET_BITS が定義されない場合、デフォルトで _FILE_OFFSET_BITS==32 となります。これらの規則は <sys/feature_tests.h> ヘッダーファイルに定義されています。
表 A–4 変更された派生型 — FILE_OFFSET_BITS 値
派生型 |
_ILP32 _FILE_ OFFSET_BITS ==32 |
_ILP32 _FILE_ OFFSET_BITS ==64 |
_LP64 _FILE_ OFFSET_BITS==64 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|