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.11 不完全类型

ISO C 标准引入术语“不完全类型”使 C 的基本(但容易造成误解)部分形式化,这种类型的开头具有某种暗示。本节介绍了不完全类型、在何处允许使用它们以及其有用的原因。

6.11.1 类型

ISO 将 C 的类型分为三个不同的集合: 函数、对象和不完全。函数类型很明显;对象类型包含其他一切,除非不知道对象的大小。该标准使用术语“对象类型”指定指派的对象必须具有已知大小,但请注意,除 void 之外的不完全类型也称为对象。

不完全类型有三种不同形式: void、未指定长度的数组以及具有非指定内容的结构和联合。void 类型与其他两种类型不同,因为它是无法完成的不完全类型,并且它用作特殊函数返回和参数类型。

6.11.2 完成不完全类型

通过在表示相同对象的相同作用域中的后面声明中指定数组大小,可完成数组类型。当声明并在相同声明中初始化不具有大小的数组时,仅在其声明符的末尾与其初始化函数的末尾之间,数组才具有不完全类型。

通过在具有相同标记的相同作用域中的后面声明中指定内容,可完成不完全结构或联合类型。

6.11.3 声明

某些声明可使用不完全类型,但是其他声明需要完全对象类型。需要对象类型的声明是数组元素、结构或联合的成员以及函数的局部对象。所有其他声明允许不完全类型。特别地,允许下列构造:

函数返回和参数类型特殊。除 void 之外,在定义或调用函数之前,必须完成以这种方式使用的不完全类型。返回类型 void 指定不返回值的函数,单个参数类型 void 指定不接受参数的函数。

由于数组和函数的参数类型重写为指针类型,因此表面上不完全的数组参数类型实际上并非不完全。main 的 argv 的典型声明(即 char *argv[],一个未指定长度的字符指针数组)重写为指向字符指针的指针。

6.11.4 表达式

大多数表达式运算符需要完全对象类型。仅有的三个例外是一元运算符 &、逗号运算符的第一个操作数以及 ?: 运算符的第二个和第三个操作数。除非需要指针运算,否则接受指针操作数的大多数运算符也允许指向不完全类型的指针。该列表包含一元运算符 *。

例如,假设有以下表达式,则 &*p 是可利用此情况的有效子表达式。

void *p

6.11.5 使用原因

除了 void 之外,C 没有其他方法可处理不完全类型:结构和联合的前向引用。如果两个结构需要相互指向的指针,则唯一的方法是使用不完全类型:

struct a { struct b *bp; };
struct b { struct a *ap; };

具有某种形式的指针以及异构数据类型的所有强类型编程语言提供处理这种情形的某些方法。

6.11.6 示例:不完全类型

为不完全结构和联合类型定义 typedef 名称通常很有用。如果您有一系列包含许多相互指向的指针的复杂数据结构,结构前面有一个 typedef 列表(可能在中央头文件中),则可以简化声明。

typedef struct item_tag Item;
typedef union note_tag Note;
typedef struct list_tag List;
.  .  .
struct item_tag { .  .  .  };
.  .  .
struct list_tag {
    struct list_tag {
};

此外,对于其内容不应该用于程序其余部分的结构和联合,头文件可以声明不带该内容的标记。程序的其他部分可以使用指向不完全结构或联合的指针而不会出现任何问题,除非它们尝试使用它的任何成员。

频繁使用的不完全类型是未指定长度的外部数组。通常,要使用某个数组的内容,无需知道该数组的范围。