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.7 多字节字符和宽字符

最初,ISO C 的国际化仅影响库函数。但是,国际化的最终阶段(多字节字符和宽字符)还影响语言。

1990 ISO/IEC C 标准提供了五个管理多字节字符和宽字符的库函数,1999 ISO/IEC C 标准提供了更多此类函数。

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

亚洲语言计算机环境的基本难题是 I/O 所需的大量表意符号。要在常规计算机体系结构的制约下工作,应以字节序列形式对这些表意符号进行编码。相关的操作系统、应用程序和终端将这些字节序列理解为单个表意字符。此外,所有这些编码都允许将常规单字节字符与表意字符字节序列混杂在一起。识别不同表意符号的难度取决于所使用的编码方案。

无论使用什么编码方案,ISO C 均将术语“多字节字符”定义为表示为表意字符编码的字节序列。所有多字节字符都是“扩展字符集”的成员。常规的单字节字符仅仅是多字节字符的特殊情形。对编码的唯一要求是多字节字符不能将空字符用作它的编码的一部分。

ISO C 指定程序注释、文本字符串、字符常量和头文件名均为多字节字符序列。

6.7.2 编码变化 (Encoding Variations)

编码方案分为两种。第一种方案是,每个多字节字符都是自标识的,即,可以在任何多字节字符对之间插入任何多字节字符。

第二种方案是,特殊的移位字节的存在会更改后续字节的解释。某些字符终端进入和退出行绘制模式所用的方法就是一个例子。对于使用与移位状态相关的编码以多字节字符编写的程序,ISO C 要求每个注释、文本字符串、字符常量和头文件名称都必须以未移位状态开始和结束。

6.7.3 宽字符

如果所有字符的字节数或位数都相同,则会消除处理多字节字符的一些不便之处。由于这样的字符集可以包含成千上万的表意字符,因此应使用 16 位或 32 位大小的整数值容纳所有成员。(整个中文字母表包含的表意字符超过 65,000 个!)ISO C 包括 typedef 名称 wchar_t,将其作为大得足以容纳扩展字符集的所有成员的实现定义整数类型。

每个宽字符都有一个对应的多字节字符,反之亦然。对应于常规单字节字符的宽字符需要具有与其单字节值相同的值,包括空字符。但是,宏 EOF 不一定存储在 wchar_t 中,因为 EOF 可能无法表示为 char。

6.7.4 C 语言特征

为了给亚洲语言环境中的程序员带来更大的灵活性,ISO C 提供了宽字符常量和宽文本字符串。它们具有与其非宽版本相同的形式,但位置是紧邻字母 L 之后:

在常规版本和宽版本中,多字节字符均有效。生成表意字符 ¥ 所必需的字节序列与编码有关,但是如果它由多个字节组成,则字符常量 ’¥’ 的值是实现定义的,正如 ’ab’ 的值是实现定义的一样。除了换码序列之外,常规文本字符串包含引号之间指定的字节,包括每个指定的多字节字符的字节。

当编译系统遇到宽字符常量或宽文本字符串时,每个多字节字符都将转换为宽字符,如同调用了 mbtowc() 函数一样。因此,L'¥' 的类型为 wchar_t;abc¥xyz 的类型为八位数组 wchar_t。正如常规文本字符串那样,每个宽文本字符串都附加有额外的零值元素,但是在这些情况下,它是值为零的 wchar_t。

正如常规文本字符串可用作字符数组初始化的快捷方法,宽文本字符串可用于初始化 wchar_t 数组:

wchar_t *wp = L"a¥z";
wchar_t x[] = L"a¥z";
wchar_t y[] = {L’a’, L’¥’, L’z’, 0};
wchar_t z[] = {’a’, L’¥’, ’z’, ’\0’};

在此示例中,x、y 和 z 这三个数组以及 wp 指向的数组具有相同长度。所有数组均使用相同的值进行初始化。

最后,正如常规文本字符串一样,串联相邻宽文本字符串。但是,对于 1990 ISO/IEC C 标准,相邻常规文本字符串和宽文本字符串会产生不确定的行为。此外,1990 ISO/IEC C 标准还指定如果编译器不接受此类串联con,也不必生成错误。