Solaris 64 ビット 開発ガイド

付録 A 派生型の変更

デフォルトの 32 ビットコンパイル環境は、派生型およびサイズに関して従来の Solaris オペレーティング環境リリースと同じです。64 ビットコンパイル環境では、派生型をいくつか変更する必要があります。これらの派生型について、次に示す表で説明します。

コンパイル環境は 32 ビットと 64 ビットとで相違がありますが、両方の環境で同じヘッダー群が使用され、それぞれをコンパイルオプションで適切に定義することができます。アプリケーション開発者がどの選択肢を利用できるかをよりよく理解するには、_ILP32 および _LP64 という機能テストマクロを理解することが役に立ちます。

表 A-1 機能テストマクロ
 機能テストマクロ  説明
_ILP32_ILP32 機能テストマクロは、intlong、およびポインタが 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 定義が見えるようなっていることを確認する以外、開発者は何もする必要がありません。

次のコード例で、コンパイル環境に応じた正しい定義が見えるようになる機能テストマクロを使用する例を示します。


例 A-1


#if defined(_LP64)
typedef ulong_t size_t;   /* size of something in bytes */
#else
typedef uint_t size_t;    /* (historical version) */
#endif

この例にある定義で 64 ビットアプリケーションを構築する場合、size_tulong_t または unsigned long となり、これは LP64 データ型モデルでは 64 ビットです。32 ビットアプリケーションを構築する場合、size_tuint_t または unsigned int として定義されます。これは、ILP32 および LP64 のどちらのデータ型モデルでも 32 ビットです。


例 A-2


#if defined(_LP64)
typedef int     uid_t;          /* UID type             */
#else
typedef long    uid_t;          /* (historical version) */
#endif

ILP32 データ型モデルの表現が LP64 データ型モデルの表現と同じであれば、これらの例のどちらの場合でも同じ最終結果が得られたはずです。たとえば、size_tulong_t に、uid_tint に変換したとしても、32 ビットアプリケーション環境ではどちらも 32 ビット量であったはずです。しかし、従来の型表現を維持することによって、32 ビットの C および C++ アプリケーション同士の整合性と、Solaris の以前のバージョンとのバイナリおよびソースの互換性が保証されています。

表 A-2 に、変更された派生型を示します。_ILP32 機能テストマクロの欄の型は、Solaris ソフトウェアに 64 ビットサポートが追加される前の Solaris 2.6 の型と同じであることに注意してください。32 ビットアプリケーションを作成する場合に利用できる派生型は _ILP32 欄の型です。64 ビットアプリケーションを作成する場合に利用できる派生型は _LP64 欄の型です。これらの型はすべて <sys/types.h> に定義されています。例外は wchar_twint_t 型で、これらは <wchar.h> に定義されています。

これらの表を再確認するときには、32 ビット環境では intlong、およびポインタは 32 ビット量である、ということを憶えておいてください。64 ビット環境では、int は 32 ビット量ですが、long およびポインタは 64 ビット量です。

表 A-2 変更された派生型 - 一般

派生型 

Solaris 2.6 

_ILP32

_LP64

blkcnt_t

longlong_t

longlong_t

long

id_t

long

long

int

major_t

ulong_t

ulong_t

uint_t

minor_t

ulong_t

ulong_t

uint_t

mode_t

ulong_t

ulong_t

uint_t

nlink_t

ulong_t

ulong_t

uint_t

paddr_t

ulong_t

ulong_t

未定義 

pid_t

long

long

int

ptrdiff_t

int

int

long

size_t

uint_t

uint_t

ulong_t

ssize_t

int

int

long

uid_t

long

long

int

wchar_t

long

long

int

wint_t

long

long

int

表 A-3 に、大規模ファイルのコンパイル環境に固有の派生型を示します。これらの型は、機能テストマクロの _LARGEFILE64_SOURCE が定義されている場合にのみ定義されます。ILP32 コンパイル環境が Solaris 2.6 と同じであることに注意してください。

表 A-3 変更された派生型 - 大規模ファイルの場合のみ

派生型 

Solaris 2.6 

_ILP32

_LP64

blkcnt64_t

longlong_t

longlong_t

blkcnt_t

fsblkcnt64_t

u_longlong_t

u_longlong_t

blkcnt_t

fsfilcnt64_t

u_longlong_t

u_longlong_t

fsfilcnt_t

ino64_t

u_longlong_t

u_longlong_t

ino_t

off64_t

longlong_t

longlong_t

off_t

表 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

ino_t

ulong_t

u_longlong_t

ulong_t

blkcnt_t

long

longlong_t

long

fsblkcnt_t

ulong_t

u_longlong_t

ulong_t

fsfilcnt_t

ulong_t

u_longlong_t

ulong_t

off_t

long

longlong_t

long