JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

3.  并行化 C 代码

4.  lint 源代码检验器

5.  基于类型的别名分析

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

7.1 数据模型差异概述

7.2 实现单一源代码

7.2.1 派生类型

7.2.1.1 <sys/types.h>

7.2.1.2 <inttypes.h>

定宽整型

诸如 unintptr_t 的有用类型

常量宏

限制

格式字符串宏

7.2.2 使用 lint 检查

7.3 转换为 LP64 数据类型模型

7.3.1 整型和指针长度更改

7.3.2 整型和长型长度更改

7.3.3 符号扩展

7.3.4 指针运算而不是整数

7.3.5 结构

7.3.6 联合

7.3.7 类型常量

7.3.8 注意隐式声明

7.3.9 sizeof( ) 是无符号 long

7.3.10 使用强制类型转换显示您的意图

7.3.11 检查格式字符串转换操作

7.4 其他转换注意事项

7.4.1 注意:长度增长的派生类型

7.4.2 检查更改的副作用

7.4.3 检查直接使用 long 是否仍有意义

7.4.4 对显式 32 位与 64 位原型使用 #ifdef

7.4.5 调用转换更改

7.4.6 算法更改

7.5 入门指导核对表

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

C.  实现定义的 ISO/IEC C99 行为

D.  C99 的功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

G.  性能调节

H.  Oracle Solaris Studio C:K&R C 与 ISO C 之间的差异

索引

7.4 其他转换注意事项

其余指导原则将重点说明将应用程序转换为完全 64 位程序时遇到的常见问题。

7.4.1 注意:长度增长的派生类型

现在,许多派生类型在 64 位应用程序编译环境中表示 64 位值。此更改不会影响 32 位应用程序;但是,使用或导出这些类型所描述的数据的任何 64 位应用程序均需要重新求值。例如,在直接处理 utmp(4) 或 utmpx(4) 文件的应用程序中,不会尝试直接访问这些文件。要在 64 位应用程序环境中执行正确的操作,请改用 getutxent (3C) 和相关的函数系列。

7.4.2 检查更改的副作用

需要注意的一个问题是,一个区域中的类型更改可能会导致另一个区域中进行意外的 64 位转换。例如,如果某个函数以前返回 int 而现在返回 ssize_t,则需要检查所有调用程序。

7.4.3 检查直接使用 long 是否仍有意义

定义为 long 的变量在 ILP32 数据类型模型中为 32 位,在 LP64 数据类型模型中为 64 位。如有可能,通过重新定义变量并使用可移植性更强的派生类型避免出现问题。

与此问题相关的是,许多派生类型在 LP64 数据类型模型中已更改。例如,在 32 位环境中,pid_t 仍为 long,而在 64 位环境中,pid_tint

7.4.4 对显式 32 位与 64 位原型使用 #ifdef

在某些情况下,一个接口存在特定的 32 位和 64 位版本是不可避免的。可以通过在头文件中指定 _LP64_ILP32 功能测试宏区分这些版本。同样,在 32 位和 64 位环境中运行的代码需要利用相应的 #ifdefs,具体取决于编译模式。

7.4.5 调用转换更改

当您通过值传递结构并针对 64 位环境编译代码时,若结构足够小,则通过寄存器传递结构而不是将结构作为副本的指针。如果您尝试在 C 代码与手写汇编代码之间传递结构,此过程会导致问题。

浮点参数的工作方式类似:有些通过值传递的浮点值通过浮点寄存器传递。

7.4.6 算法更改

在确认代码对 64 位环境是安全的之后,请再次检查代码,以验证算法和数据结构是否仍有意义。数据类型较长,因此数据结构可能占用更多空间。代码的性能也可能变化。出于这些利害关系考虑,您可能需要相应地修改代码。