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

6.1 基本模式

6.1.1 -Xc

6.1.2 -Xa

6.1.3 -Xt

6.1.4 -Xs

6.2 新式函数原型

6.2.1 编写新代码

6.2.2 更新现有代码

6.2.3 混合使用的注意事项

6.3 带有可变参数的函数

6.4 提升:无符号保留与值保留

6.4.1 一些历史背景

6.4.2 编译行为

6.4.3 示例:强制类型转换的使用

6.4.4 示例:相同的结果,不发出警告

6.4.5 整型常量

6.4.6 示例:整形常量

6.5 标记化和预处理

6.5.1 ISO C 转换阶段

6.5.2 旧 C 转换阶段

6.5.3 逻辑源代码行

6.5.4 宏替换

6.5.5 使用字符串

6.5.6 标记粘贴

6.6 const 和 volatile

6.6.1 仅适用于 lvalue 的类型

6.6.2 派生类型中的类型限定符

6.6.3 const 意味着 readonly

6.6.4 const 用法示例

6.6.5 volatile 用法示例

6.7 多字节字符和宽字符

6.7.1 亚洲语言需要多字节字符

6.7.2 编码变化 (Encoding Variations)

6.7.3 宽字符

6.7.4 C 语言特征

6.8 标准头文件和保留名称

6.8.1 标准头文件

6.8.2 保留供实现使用的名称

6.8.3 保留供扩展使用的名称

6.8.4 可安全使用的名称

6.9 国际化

6.9.1 语言环境

6.9.2 setlocale() 函数

6.9.3 更改的函数

6.9.4 新函数

6.10 表达式中的分组和求值

6.10.1 表达式定义

6.10.2 K&R C 重新整理许可证

6.10.3 ISO C 规则

6.10.4 括号用法

6.10.5 As If 规则

6.11 不完全类型

6.11.1 类型

6.11.2 完成不完全类型

6.11.3 声明

6.11.4 表达式

6.11.5 使用原因

6.11.6 示例:不完全类型

6.12 兼容类型和复合类型

6.12.1 多个声明

6.12.2 分别编译兼容性

6.12.3 单编译兼容性

6.12.4 兼容指针类型

6.12.5 兼容数组类型

6.12.6 兼容函数类型

6.12.7 特殊情况

6.12.8 复合类型

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

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 之间的差异

索引

6.12 兼容类型和复合类型

对于 K&R C,引用同一实体的两个声明可能是不同的;对于 ISO C 更是如此。ISO C 中使用的术语“兼容类型”表示“足够接近”的类型。本节介绍了兼容类型和“复合类型”,后者是合并两种兼容类型而产生的结果。

6.12.1 多个声明

如果只允许 C 程序声明每个对象或函数一次,则不一定需要兼容类型。链接(允许两个或更多声明引用相同实体)、函数原型和分别编译全部需要此功能。独立转换单元(源文件)具有与单个转换单元不同的类型兼容性规则。

6.12.2 分别编译兼容性

由于每个编译可能查看不同的源文件,因此独立编译中的大多数兼容类型规则实质上是结构化的:

6.12.3 单编译兼容性

当相同作用域内的两个声明描述相同的对象或函数时,这两个声明必须指定兼容类型。然后这两种类型合并为与这两种类型兼容的单个复合类型。

兼容类型是递归定义的。底部为类型说明符关键字。这些规则规定,unsigned short 与 unsigned short int 相同,不带类型说明符的类型与带有 int 的类型相同。所有其他类型仅当派生它们的类型兼容时才为兼容类型。例如,如果限定符 const 和 volatile 是相同的,且未限定基类型是兼容的,则两个限定类型是兼容的。

6.12.4 兼容指针类型

要使两种指针类型兼容,它们指向的类型必须兼容,并且必须对这两个指针进行相同的限定。考虑到指针的限定符在 * 之后指定,因此以下两个声明所声明的两个不同限定指针指向同一类型 int。

int *const cpi;
int *volatile vpi;

6.12.5 兼容数组类型

要使两个数组类型兼容,它们的元素类型必须兼容。如果两个数组类型具有指定的大小,则它们必须匹配,即,不完全数组类型(请参见6.11 不完全类型)同时与另一不完全数组类型和一个具有指定大小的数组类型兼容。

6.12.6 兼容函数类型

要使函数兼容,请遵守以下规则:

6.12.7 特殊情况

signed int 的行为与 int 相同,不同之处可能在于位字段,其中无格式 int 可能表示无符号的值。

请注意,每个枚举类型必须与某些整数类型兼容。对于可移植的程序,这意味着枚举类型是独立类型。通常,ISO C 标准将枚举类型视为独立类型。

6.12.8 复合类型

由两个兼容类型构成的复合类型也是递归定义的。兼容类型可能彼此不同的原因在于不完全数组或旧式函数类型。因此,复合类型最简单的描述是,它是与两个原始类型均兼容的类型,包括原始类型中的各个可用数组大小和各个可用参数列表。