就派生类型及其长度而言,缺省的 32 位编译环境与早期发行版的 Solaris 操作环境相同。在 64 位编译环境中,有必要对派生类型进行一些更改。以下各表中将重点介绍这些经过更改的派生类型。
请注意,尽管 32 位和 64 位编译环境不同,但是它们使用同一组头文件,其相应的定义通过编译选项确定。为了更好地了解可供应用程序开发者使用的选项,首先了解 _ILP32 和 _LP64 功能测试宏会有所帮助。
表 A–1 功能测试宏
功能测试宏 |
说明 |
---|---|
_ILP32 |
_ILP32 功能测试宏用来指定 ILP32 数据模型,该模型中类型为 |
_LP64 |
_LP64 功能测试宏用来指定 _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
的数据(在 LP32 或 LP64 模型中是 32 位值)。
#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_t
和 wint_t
类型在 <wchar.h> 中定义以外,所有这些类型都在 <sys/types.h> 中定义。
检查这些表时,请记住,在 32 位环境中类型为 int
、long
的数据和指针是 32 位的;在 64 位 环境中,类型为 int
的数据是 32 位的,而类型为 long
的数据和指针则是 64 位的。
派生类型 |
Solaris 2.6 |
_ILP32 |
_LP64 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
未定义 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表 A–3 列出了特定于大文件编译环境的派生类型。这些类型仅在定义了 _LARGEFILE64_SOURCE 功能测试宏的情况下才会进行定义。请注意,以前的 Solaris 2.6 发行版中保留了 ILP32 编译环境。
表 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 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|