デフォルトの 32 ビットコンパイル環境は、派生型およびサイズに関して従来の Solaris オペレーティング環境リリースと同じです。64 ビットコンパイル環境では、派生型をいくつか変更する必要があります。これらの派生型について、次に示す表で説明します。
コンパイル環境は 32 ビットと 64 ビットとで相違がありますが、両方の環境で同じヘッダー群が使用され、それぞれをコンパイルオプションで適切に定義することができます。アプリケーション開発者がどの選択肢を利用できるかをよりよく理解するには、_ILP32 および _LP64 という機能テストマクロを理解することが役に立ちます。
表 A-1 機能テストマクロ機能テストマクロ | 説明 |
---|---|
_ILP32 | _ILP32 機能テストマクロは、int、long、およびポインタが 32 ビット量である ILP32 データ型モデルを指定するのに使用します。このマクロを使用すれば、自動的に従来の Solaris の実装と同じ派生型およびサイズが見えるようになります。これは、32 ビットアプリケーションを構築するときのデフォルトのコンパイル環境です。これによって C および C++ アプリケーションに対するバイナリおよびソースの互換性が保証されます。 |
_LP64 | _LP64 機能テストマクロは、int は 32 ビット量で long とポインタは 64 ビット量である LP64 データ型モデルを指定するのに使用します。_LP64 は、64 ビットモード (-xarch=v9) でコンパイルするときにデフォルトで定義されます。<sys/types.h> または <sys/isa_defs.h> がソースにインクルードされて _LP64 定義が見えるようなっていることを確認する以外、開発者は何もする必要がありません。 |
次のコード例で、コンパイル環境に応じた正しい定義が見えるようになる機能テストマクロを使用する例を示します。
#if defined(_LP64) typedef ulong_t size_t; /* size of something in bytes */ #else typedef uint_t size_t; /* (historical version) */ #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 type */ #else typedef long uid_t; /* (historical version) */ #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 ビット量です。
表 A-2 変更された派生型 - 一般
派生型 |
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 となります。これらの規則は feature_tests.h ヘッダーファイルに定義されています。
表 A-4 変更された派生型 - FILE_OFFSET_BITS 値
派生型 |
_ILP32 _FILE_ OFFSET_BITS ==32 |
_ILP32 _FILE_ OFFSET_BITS ==64 |
_LP64 _FILE_ OFFSET_BITS==64 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|