Solaris(64 位)开发者指南

附录 A 派生类型更改

就派生类型及其长度而言,缺省的 32 位编译环境与早期发行版的 Solaris 操作环境相同。在 64 位编译环境中,有必要对派生类型进行一些更改。以下各表中将重点介绍这些经过更改的派生类型。

请注意,尽管 32 位和 64 位编译环境不同,但是它们使用同一组头文件,其相应的定义通过编译选项确定。为了更好地了解可供应用程序开发者使用的选项,首先了解 _ILP32_LP64 功能测试宏会有所帮助。

表 A–1 功能测试宏

功能测试宏 

说明 

_ILP32

_ILP32 功能测试宏用来指定 ILP32 数据模型,该模型中类型为 intlong 的数据和指针是 32 位的。如果仅使用该宏,则会使与以前 Solaris 实现相同的派生类型和长度可见。此为生成 32 位应用程序时的缺省编译环境,它可确保 C 和 C++ 应用程序保持完全二进制和源代码兼容。

_LP64

_LP64 功能测试宏用来指定 _LP64 数据模型,该模型中类型为 int 的数据是 32 位的,类型为 long 的数据和指针是 64 位的。如果是在 64 位模式下进行编译,则缺省情况下会定义 _LP64。开发者只需确保在源代码中包括 <sys/types.h><sys/feature_tests.h>,即可使 _LP64 定义可见。

以下几个示例说明如何根据编译环境使用功能测试宏来使正确的定义可见。


示例 A–1 _LP64 中定义的 size_t

#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_tunsigned long 的数据(在 LP64 模型中是 64 位值)。相反,生成 32 位应用程序时,size_t 会定义成类型为 uint_tunsigned int 的数据(在 LP32 或 LP64 模型中是 32 位值)。


示例 A–2 _LP64 中定义的 uid_t

#if defined(_LP64)

typedef int     uid_t;          /* UID type             */

#else

typedef long    uid_t;          /* (historical version) */

#endif

在以上任一示例中,只要 ILP32 类型表示形式与 LP64 类型表示形式相同,即可获取相同的最终结果。例如,如果在 32 位应用程序环境中将 size_t 更改为 ulong_t,或者将 uid_t 更改为 int,则这些类型仍表示 32 位值。但是,保留以前的类型表示形式可确保在 32 位 C 和 C++ 应用程序中保持一致,并与早期发行版的 Solaris 操作环境保持完全二进制兼容和源代码兼容。

表 A–2 列出了已经更改的派生类型。请注意,在向 Solaris 软件中添加 64 位支持以前,_ILP32 功能测试宏下面列出的类型与 Solaris 2.6 中的类型相匹配。生成 32 位应用程序时,可供开发者使用的派生类型与 _ILP32 列中的类型相匹配。生成 64 位应用程序时,派生类型与 _LP64 列中所列的类型相匹配。除了 wchar_twint_t 类型在 <wchar.h> 中定义以外,所有这些类型都在 <sys/types.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 功能测试宏的情况下才会进行定义。请注意,以前的 Solaris 2.6 发行版中保留了 ILP32 编译环境。

表 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。这些规则在 <sys/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