附 录 B 实 现 定 义 的 行 为

ANSI X3.159-1989, 美 国 国 家 信 息 系 统 标 准 — — 程 序 设 计 语 言 — — C, 包 含 一 个 称为 “ 移 植 性 问 题 ” 的 附 录 , 这个 ANSI 附 录 列 出 了 ANSI 保 持 开 放 的 每 个 特 殊 实 现的 C 语 言 的 区 域 。 本 附 录 描 述 了 Microsoft C 如 何 处 理 这 些 C 语 言 的 实 现 定 义的 区 域 。

本 附 录 遵 循 ANSI 附 录 同 样 的 次 序 。 每 个 项 包 括 ANSI 章 节 解 释 实 现 定 义 的 行 为的 引 用 。

注 意 : 本 附 录 仅 描 述 了 C 编 译 器 的 U.S. 英 语 版 本 , 其 它 语 言 的 Microsoft 实 现 可能 有 点 不 同 。

转 换 : 诊 断

ANSI 2.1.1.3 如 何 标 识 一 个 诊 断

Microsoft C 以 如 下 格 式 产 生 错 误 消 息 :

filename(line-number):diagnostic Cnumber message

这 里 filename 是 遇 到 错 误 的 源 文 件 的 名 称 ;line-number 是 编 译 器 检 测 到 错 误的 行 号 ;diagnostic 是 “ 错 误 ” 或 “ 警 告 ” ;number 是 一 个 唯 一 的 标 识 错 误 或 警

告 的 4 数 字 编 号 ( 前 面 有 一 个 像 该 语 法 中 标 记 的 C);message 是 一 个 解 释 的 消 息 。

环 境

  • main 的 参 量

  • 交 互 设 备

main 的 参 量

ANSI 2.1.2.2.1 main 的 参 量 的 语 义

在 Microsoft C 中 , 程 序 启 动 时 调 用 的 函 数 称 为 main 。 main 没 有 说 明 的 原 型 , 它可 以 定 义 为 0 , 2 或 3 个 参 数 :

int main (void)

int main (int argc,char *argv[])

int main (int argc,char *argv[],char *envp[])

上 述 第 三 行 main 接 受 三 个 参 数 , 它 是 Microsoft 对 ANSI C 标 准 的 扩 充 。 第 3 个参 数 envp 是 环 境 变 量 的 指 针 数 组 。envp 数 组 以 一 个 空 格 指 针 标 志 结 尾 。有 关 main 和 envp 的 更 多 信 息 参 见 第 2 章 “ 程 序 结 构 ” 中 的 “ main 函 数 和 程 序 执 行 ”。

变 量 argc 不 会 是 负 数 。

字 符 串 数 组 以 ar g v[argc] 结 尾 , 它 包 含 一 个 空 格 指 针 。argv 数 组 的 所 有 元 素 都 是 字 符 串 的 指 针 。

没 有 命 令 行 参 量 调 用 的 一 个 程 序 将 接 受 为 1 的 argc, 可 执 行 文 件 名 称 放 在 argv[0 中 ( 在 MS-DOS 3.0 以 前 版 本 中 , 该 可 执 行 文 件 名 称 是 不 用 的 , 在 argv[0] 中 放 置字 母 “ C ” ) 。 argv[1] 到 argv[argc-1] 所 指 的 字 符 串 表 示 该 程 序 的 参 数 。

在 程 序 启 动 到 程 序 终 止 之 间 , 参 数 argc 和 argv 是 可 修 改 的 并 保 持 它 们 最 后 存 储的 值 。

交 互 设 备

ANSI 2.1.2.3 哪 些 构 成 一 个 交 互 设 备

Microsoft C 定 义 键 盘 和 显 示 器 为 交 互 设 备 。

标 识 符 的 行 为

  • 没 有 外 部 连 接 的 有 效 字 符 个 数

  • 有 外 部 连 接 的 有 效 字 符 个 数

  • 大 写 和 小 写

没 有 外 部 连 接 的 有 效 字 符 个 数

ANSI 3.1.2 没 有 外 部 连 接 的 有 效 字 符 个 数

标 识 符 有 效 字 符 可 达 247 个 , 编 译 器 不 限 制 一 个 标 识 符 中 使 用 的 字 符 个 数 , 但 它

忽 略 超 过 这 个 限 制 的 任 何 字 符 。

有 外 部 连 接 的 有 效 字 符 个 数

ANSI 3.1.2 有 外 部 连 接 的 有 效 字 符 个 数

在 程 序 中 说 明 的 extern 标 识 符 用 Microsoft C 编 译 时 可 达 247 个 有 效 字 符 。 你可 以 使 用 /H( 限 制 外 部 名 称 的 长 度 ) 选 项 修 改 这 个 缺 省 值 为 较 小 的 值 。

大 写 和 小 写

ANSI 3.1.2 区 分 大 小 写

Microsoft C 在 一 个 编 译 单 元 中 把 标 识 符 处 理 为 大 小 写 敏 感 的 。

Microsoft C 链 接 器 是 大 小 写 敏 感 的 , 你 必 须 根 据 大 小 写 一 致 性 地 指 定 所 有 标 识符 。

字 符

  • ASCII 字 符 集

  • 多 字 节 字 符

  • 每 个 字 符 的 位 数

  • 字 符 集

  • 不 能 表 示 的 字 符 常 量

  • 宽 字 符

  • 转 换 多 字 节 字 符

  • 字 符 值 的 范 围

ASCII 字 符 集

ANSI 2.2.1 源 和 执 行 字 符 集 的 成 员

源 字 符 集 是 可 以 出 现 在 源 文 件 中 合 法 的 字 符 串 。 对 于 Microsoft C, 源 字 符 集 是标 准 ASCII 字 符 集 。

警 告 : 因 为 键 盘 和 控 制 台 驱 动 程 序 可 以 重 新 映 射 字 符 集 。 用 于 国 际 发 布 的 程 序 要检 测 国 家 代 码 。

多 字 节 字 符

ANSI 2.2.1.2 多 字 节 字 符 的 位 移 状 态

多 字 节 字 符 被 某 些 实 现 包 括 Microsoft C 使 用 来 表 示 不 能 以 基 字 符 集 表 示 的 外国语言字符。但 Microsoft C 不 支 持 任 何 依 赖 于 国 家 的 编 码 , 因 此 没 有 位 移 状 态 。更 多 的 信 息 参 见 第 1 章 , “ C 的 基 本 元 素 ” 中 的 “ 多 字 节 和 宽 字 符 ”。

每 个 字 符 的 位 数

ANSI 2.2.4.2.1 一 个 字 符 中 的 位 数

  • 个 字 符 中 的 位 数 由 显 式 常 量 CHAR_BIT 表 示 。 LIMITS.H 文 件 定 义 CHAR_BIT 为8 。

字 符 集

ANSI 3.1.3.4 映 射 源 字 符 集 的 成 员

源 字 符 集 和 执 行 字 符 集 包 括 表 B.1 中 所 列 的 ASCII 字 符 , 转 义 序 列 也 在 这 个 表 中列 出 。

表 B.1 转 义 序 列

转义序列

字符

ASCII 值

\a

报警 / 响铃

7

\b

回退

8

\f

换页

12

\n

换行

10

\r

回车

13

\t

水 平 制 表

9

\v

垂 直 制 表

11

\"

双引号

34

\'

单引号

39

\\

不 能 表 示 的 字 符 常 量

反斜杠

92

ANSI 3.1.3.4 包 含 一 个 不 能 在 基 本 执 行 字 符 集 中 或 者 对 于 宽字 符 常 量 不 能 在 扩 充 的 字 符 集 中 表 示 的 字 符 或 转 义 序 列 的 整数 字 符 常 量 的 值

所 有 字 符 常 量 或 转 义 序 列 能 够 在 扩 充 的 字 符 集 中 表 示 。

宽 字 符

ANSI 3.1.3.4 包 含 一 个 以 上 字 符 的 整 数 字 符 常 量 的 值 或 者 包 含 一 个 以 上 多 字 节字 符 的 宽 字 符 常 量

出 现 的 字 符 常 量 'ab' 的 整 数 值 (int)0x6162 。 当 有 一 个 以 上 字 节 时 , 前 面 读 的 字节 通 过 CHAR_BIT 的 值 向 左 位 移 , 下 一 个 字 节 使 用 按 位 OR 运 算 与 CHAR_BIT 低 位进 行 比 较 。 在 该 多 字 节 字 符 常 量 中 的 字 节 数 不 能 超 过 sizeof(int), 对 于 32 位目 标 代 码 它 为 4 。

该 多 字 节 字 符 常 是 量 像 上 述 那 样 读 , 使 用 mbtowc 运 行 函 数 转 换 为 一 个 宽 字 符 常量 , 如 果 该 结 果 不 是 一 个 有 效 的 宽 字 符 常 量 , 则 发 生 一 个 错 误 。在 任 何 事 件 mbtowc 函 数 检 查 的 字 节 个 数 受 限 于 MB_CUR_MAX 的 值 。

转 换 多 字 节 字 符

ANSI 3.1.3.4 使 用 当 前 场 合 把 多 字 节 字 符 转 换 成 一 个 宽 字 符常 量 对 应 的 宽 字 符 ( 代 码 )

当 前 场 所 缺 省 为“ C ”场 所 。可 以 使 用 setlocale 库 例 程 改 变 。当 前 场 所 的 LC_CTYPE 目 录 设 置 当 前 的 工 作 代 码 页 , 它 确 定 多 字 节 和 宽 字 符 集 之 间 的 对 应 和 转 换 。mbstowcs , wcstombs , mbtowc 和 wctomb 库 例 程 提 供 了 多 字 节 和 宽 字 符 集 之 间的 直 接 映 射 。 很 多 流 例 程 , 例 如 print , scan , get 和 put 簇 也 自 动 提 供 这 两 个字 符 集 之 间 的 映 射 。

字 符 值 的 范 围

ANSI 3.2.1.1 一 个 “ 普 通 的 ” char 是 否 和 一 个 signed char 或一 个 unsigned char 值 具 有 相 同 的 范 围

所 有 有 符 号 值 范 围 从 -128 到 127 。 所 有 无 符 号 字 符 值 范 围 从 0 到 255 。

/J 编 译 器 选 项 把 缺 省 值 从 signed 改 变 为 unsigned 。

整 数

  • 整 数 值 的 范 围

  • 整 数 的 提 升

  • 有 符 号 的 按 位 运 算

  • 余 数

  • 向 右 位 移

整 数 值 的 范 围

ANSI 3.1.2.5 各 种 整 数 类 型 的 表 示 和 值 集

整 数 包 含 32 个 位 (4 个 字 节 ) 。 有 符 号 整 数 以 2 的 补 码 形 式 表 示 。 对 于 负 数 最 重

要 的 有 效 位 为 1; 对 于 正 数 和

0

0 。 该 值 列 出 如 下 :

类型

最小值和最大值

unsigned short

0 到 65535

signed short

-32768 到 32767

unsigned long

0 到 4294967295

signed long

-2147483648 到 2147483647

整 数 的 提 升

ANSI 3.2.1.2 把 一 个 整 数 转 换 成 一 个 较 短 的 有 符 号 整 数 , 或 者把 一 个 无 符 号 整 数 转 换 成 相 等 长 度 的 有 符 号 整 数 , 如 果 转 换 的值 不 能 表 示 ,那 么 结 果 如 何

当 一 个 long 整 数 造 型 转 换 为 一 个 short, 或 者 一 个 short 造 型 转 换 为 一 个 char, 则 保 留 低 位 的 有 效 字 节 。

例 如 , 这 样 的 行 :

short x=(short)0x12345678L; 把 0x5678 赋 给 x, 这 样 的 行 :

char y=(char)0x1234; 把 值 0x34 赋 给 y 。

当 把 有 符 号 变 量 转 换 成 无 符 号 值 , 位 模 式 保 持 相 同 , 反 之 亦 然 。 例 如 , 造 型

-2(0xFE) 转 换 为 一 个 无 符 号 值 产 生 254( 也 就 是 0xFE) 。

有 符 号 按 位 运 算

ANSI 3.3 有 符 号 整 数 上 按 位 运 算 的 结 果

在 有 符 号 整 数 上 的 按 位 运 算 与 在 无 符 号 整 数 上 的 按 位 运 算 相 同 。 例 如 ,-16&99 以 二 进 制 表 示 为 :

11111111 11110000

& 00000000 01100011


00000000 01100000

该 按 位 AND 的 结 果 为 96 。

余 数

ANSI 3.3.5 整 数 除 法 中 余 数 的 符 号

余 数 的 符 号 与 被 除 数 的 符 号 相 同 。 例 如 :

50/-6 == -8

50%-6 == 2

-50/6 == -8

-50%6 == -2

向 右 位 移

ANSI 3.3.7 一 个 有 符 号 整 数 类 型 的 负 数 向 右 位 移 的 结 果

  • 个 负 数 向 右 位 移 产 生 其 绝 对 值 向 下 舍 入 的 一 半 。 例 如 -253( 二 进 制 11111111 00000011) 向 右 位 移 一 位 产 生 -127( 二 进 制 11111111 10000001) 。 一 个 正 的 253 向 右 位 移 产 生 +126 。

右 位 移 保 留 符 号 位 。 当 一 个 有 符 号 整 数 右 位 移 时 , 最 高 有 效 位 保 留 设 置 。 当 一

个 无 符 号 整 数 右 位 移 时 , 最 高 有 效 位 被 清 除 。如 果 0xF000 是 无 符 号 的 , 其 结 果 是 0x7800 。

如 果 0xF0000000 是 有 符 号 的 , 向 右 位 移 产 生 0xF8000000 。 向 右 位 移 一 个 正 数 32 次 产 生 0xF0000000; 向 右 位 移 一 个 负 数 32 次 产 生 0xFFFFFFFF 。

浮 点 数 学

  • 造 型 转 换 整 数 为 浮 点 值

  • 浮 点 值 的 截 除

ANSI 3.1.2.5 各 种 浮 点 数 类 型 的 表 示 和 值 集

float 类 型 包 含 32 位 :1 个 符 号 位 ,8 个 指 数 位 和 32 个 尾 数 位 。 它 的 范 围 是 +/- 3.4E38, 至 少 有 7 个 精 度 数 字 。

double 类 型 包 含 64 位 :1 个 符 号 位 ,11 个 指 数 位 和 52 个 尾 数 位 。 它 的 范 围 是

+/-1.7E308, 至 少 有 15 个 精 度 数 字 。

long do u ble 类 型 包 含 80 位 :1 个 符 号 位 ,15 个 指 数 位 和 64 个 尾 数 位 。 它 的 范围 是 +/-1.2E4932, 至 少 有 19 个 精 度 数 字 。使 用 Microsoft C 编 译 器 ,long double 类 型 的 表 示 与 double 类 型 一 致 。

造 型 转 换 整 数 为 浮 点 值

ANSI 3.2.1.3 当 一 个 整 数 围 转 换 成 一 个 浮 点 数 时 , 且 不 能 准 确地 表 示 最 初 的 值 , 截 除 该 整 数 的 方 向

当 一 个 整 数 造 型 转 换 成 一 个 不 能 准 确 表 示 该 值 的 浮 点 值 时 , 该 值 被 舍 入 ( 向 上 或向 下 ) 到 最 接 近 适 合 的 值 。

例 如 , 造 型 转 换 一 个 unsigned long( 有 32 个 精 度 位 ) 为 一 个 float( 其 尾 数 有 32 个 精 度 位 ), 舍 入 该 数 为 最 接 近 256 的 倍 数 。 long 值 4294966913 到 4294967167 转 换 为 float 值 都 舍 入 为 4294967040 。

浮 点 值 的 截 除

ANSI 3.2.1.4 当 一 个 浮 点 数 转 换 成 一 个 更 窄 的 浮 点 数 时 , 截 除或 舍 入 的 方 向

当 出 现 一 个 下 溢 出 时 , 一 个 浮 点 变 量 的 值 向 下 舍 入 为 0 。 一 个 上 溢 出 导 致 一 个 运行 错 误 , 根 据 指 定 的 优 化 。 可 能 产 生 一 个 不 可 预 料 的 值 。

数 组 的 指 针

  • 最 大 数 组 尺 寸

  • 指 针 相 减

最 大 数 组 尺 寸

ANSI 3.3.3.4 , 4.1.1 需 要 一 个 整 数 类 型 保 存 一 个 数 组 的 最 大尺 寸 , 也 就 是 size_t 的 尺 寸

size_t 类 型 定 义 是 一 个 范 围 从 0x00000000 到 0x7CFFFFFF 的 unsigned int 。

指 针 相 减

ANSI 3.3.6 , 4.1.1 需 要 一 整 数 类 型 保 存 相 同 数 组 两 个 元 素 之间 的 差 , 即 ptrdiff_t

ptrdiff_t 是 一 个 范 围 从 -4294967296 到 4294967295 的 signed int 。

寄 存 器 : 寄 存 器 的 可 用 性

ANSI 3.5.1 通 过 使 用 register 存 储 类 指 示 符 实 际 放 在 寄 存 器 中对 象 的 范 围

32 位 编 译 器 能 赞 成 用 户 使 用 register 变 量 。 而 是 在 优 化 时 做 自 己 的 选 择 。

结 构 、 联 合 、 枚 举 和 位 域

  • 联 合 的 不 适 当 访 问

  • 结 构 成 员 的 填 充 和 对 齐

  • 位 域 的 符 号

  • 位 域 的 存 储

  • enum 类 型

联 合 的 不 适 当 访 问

ANSI 3.3.2.3 使 用 一 个 不 同 类 型 的 成 员 访 问 一 个 联 合 对 象 的成 员

如 果 说 明 了 一 个 联 合 的 两 个 类 型 , 且 存 储 了 一 个 值 , 但 用 另 一 个 类 型 来 访 问 该 联合 , 其 结 果 是 不 可 预 料 的 。

例 如 , 一 个 联 合 以 float 和 int 说 明 了 , 存 储 了 一 个 float 值 , 但 程 序 后 来 作 用 int 来 访 问 它 , 在 这 种 情 况 下 , 该 值 依 赖 于 float 值 的 内 部 存 储 。 该 整 数 值 不 是 可 靠的 。

结 构 成 员 的 填 充 和 对 齐

ANSI 3.5.2.1 结 构 的 成 员 的 填 充 和 对 齐 以 及 一 个 位 域 是 否 跨立 一 个 存 储 单 元 的 界 限

结 构 成 员 以 它 们 说 明 的 次 序 进 行 存 储 , 第 一 个 成 员 具 有 最 低 的 存 储 器 地 址 , 最 后成 员 具 有 最 高 的 存 储 器 地 址 。

每 个 数 据 对 象 都 有 对 齐 要 求 。 除 结 构 、 联 合 和 数 组 外 的 所 有 数 据 的 对 齐 要 求 是该 对 象 的 尺 寸 或 者 紧 凑 尺 寸 ( 用 /Zp 或 pack 编 译 指 示 指 定 , 它 更 少 些 ) 。 对 于 结构 、 联 合 和 数 组 , 对 齐 要 求 是 它 的 最 大 对 齐 要 求 。

每 个 对 象 分 配 一 个 偏 移 量 以 便 :

偏 移 量 % 对 齐 要 求 ==0

如 果 整 数 类 型 有 相 同 尺 寸 , 且 如 果 通 过 位 域 的 公 共 对 齐 要 求 强 制 下 一 个 位 域 适 合当 前 分 配 单 元 而 不 交 叉 界 限 , 则 相 邻 的 位 域 都 紧 凑 成 相 同 的 1 , 2 或 4 字 节 分 配单 元 。

位 域 的 符 号

ANSI 3.5.2.1 一 个 “ 普 通 的 ” int 域 是 处 理 为 signed int 位 域 还是 处 理 为 unsigned int 位 域

位 域 可 以 是 signed 或 unsigned 。 普 通 位 域 处 理 为 有 符 号 的 。

位 域 的 存 储

ANSI 3.5.2.1 在 一 个 int 中 位 域 的 分 配 次 序

在 一 个 整 数 中 的 位 域 分 配 从 最 低 位 到 最 高 位 。 在 如 下 代 码 中 : struct mybitfields

{

unsigned a : 4;

unsigned b : 5;

unsigned c : 7;

} test;

void main(void)

{

test.a=2;

test.b=31;

test.c=0;

}

位 排 到 如 下 :

00000001 11110010

cccccccb bbbbaaaa

由 于 80x86 处 理 器 在 高 位 字 节 之 前 存 储 低 位 字 节 , 上 面 的 整 数 0x01F2 在 物 理 存储 器 中 的 存 储 是 先 存 储 0xF2 后 跟 0x01 。

enum 类 型

ANSI 3.5.2.2 选 择 整 数 类 型 表 示 一 个 枚 举 类 型 的 值

  • 个 以 enum 说 明 的 变 量 是 一 个 int 。

修 饰 符 : 访 问 volatile 对 象

ANSI 3.5.5.3 什 么 构 成 对 具 有 volatile 修 饰 的 类 型 的 对 象 的 访问

任 何 对 一 个 volatile 修 饰 的 类 型 的 引 用 是 一 个 访 问 。

说 明 符 : 最 大 个 数

ANSI 3.5.4 修 饰 一 个 算 术 的 、 结 构 或 联 合 类 型 的 说 明 符 的 最大 个 数

Microsoft C 不 限 制 说 明 符 的 个 数 , 该 个 数 仅 受 限 于 可 用 的 存 储 器 空 间 。

语 句 :switch 语 句 的 限 制

ANSI 3.6.4.2 一 个 switch 语 句 中 case 值 的 最 大 个 数

Microsoft C 不 限 制 一 个 switch 语 句 中 case 值 的 个 数 , 该 个 数 仅 受 限 于 可 用 的存 储 器 空 间 。

预 处 理 器 命 令

  • 字 符 常 量 和 条 件 包 含

  • 包 括 括 起 的 文 件 名

  • 包 括 引 用 的 文 件 名

  • 字 符 序 列

  • 编 译 指 示

  • 缺 省 的 日 期 和 时 间

字 符 常 量 和 条 件 包 含

ANSI 3.8.1 常 量 表 达 式 中 一 个 单 字 符 字 符 常 量 的 值 控 制 条 件包 含 是 否 与 执 行 字 符 集 中 相 同 字 符 常 量 的 值 匹 配 。 这 样 的 一个 字 符 常 量 是 否 可 以 有 一 个 负 值 。 在 预 处 理 器 语 句 中 使 用 的字 符 集 与 执 行 字 符 集 相 同 。 预 处 理 器 识 别 负 字 符 值 。

包 括 括 起 的 文 件 名

ANSI 3.8.2 定 位 包 括 的 源 文 件 的 方 法

对 于 用 角 括 号 括 起 的 文 件 规 格 , 预 处 理 器 不 搜 索 父 文 件 的 目 录 。 一 个 “ 父 ” 文 件是 其 中 已 经 有 #include 命 令 的 文 件 。 而 且 从 编 译 器 命 令 行 中 /I 之 后 指 定 的 目 录开 始 搜 索 。 如 果 /I 选 择 没 有 出 现 或 失 败 , 该 预 处 理 器 使 用 INCLUDE 环 境 变 量 查找 任 何 角 括 号 中 括 起 的 文 件 。

INCLUDE 环 境 变 量 中 可 以 包 含 由 分 号 (;) 分 隔 的 多 个 路 径 。 如 果 一 个 以 上 的 目 录出 现 在 /I 选 项 之 中 或 INCLUDE 环 境 变 量 之 中 , 那 么 预 处 理 器 以 它 们 出 现 的 次 序进 行 搜 索 它 们 。

包 括 引 用 的 文 件 名

ANSI 3.8.2 支 持 包 括 的 源 文 件 中 引 用 的 名 称

如 果 你 在 两 个 双 引 号 ("") 之 间 为 包 括 的 文 件 指 出 一 个 完 整 的 、 不 模 糊 的 路 径 规格 , 该 预 处 理 器 只 搜 索 该 路 径 规 格 而 忽 略 标 准 目 录 。

对 于 指 定 为 #include"path-spec" 的 包 括 的 文 件 , 目 录 搜 索 开 始 于 父 文 件 的 目 录 , 然 后 继 续 通 过 任 何 父 文 件 的 目 录 进 行 搜 索 。 因 此 , 搜 索 相 对 于 包 含 当 前 源 文 件 的目 录 开 始 。 如 果 没 有 父 文 件 和 该 文 件 未 找 到 , 继 续 搜 索 。 好 像 该 文 件 被 括 在 角 括号 中 。

字 符 序 列

ANSI 3.8.2 源 文 件 字 符 序 列 的 映 射

除 了 不 支 持 转 义 序 列 外 , 预 处 理 器 使 用 和 源 文 件 语 句 中 相 同 的 字 符 集 。因 此 , 为 了 指 定 一 个 包 括 文 件 的 路 径 , 仅 使 用 一 个 反 斜 杠 :

#include "path1/path2/myfile" 在 源 代 码 中 , 必 须 使 用 两 个 反 斜 杠 :

fil=fopen("path1\\path2\\myfile","rt");

编 译 指 示

ANSI 3.8.6 , 每 个 识 别 的 #pragma 命 令 上 的 行 为

Microsoft C 编 译 器 定 义 了 如 下 编 译 指 示 :

alloc_text data_seg include_alia s

setlocale

auto_inline function intrinsic warning check_stack hdrstop message

code_seg inline_depth optimize

comment inline_rescursio n

pack

缺 省 日 期 和 时 间

ANSI 3.8.8 当 转 换 的 日 期 和 时 间 不 可 用 时 ,_DATE _ 和 _TIME_

分 别 定 义

当 操 作 系 统 不 支 持 转 换 的 日 期 和 时 间 时 ,_DATE_ 和 _TIME_R 缺 省 值 是 “ may 03 1957 ”和 “ 17:00:00 ”。

库 函 数

  • NULL 宏

  • assert 函 数 打 印 的 诊 断

  • 字 符 测 试

  • 域 错 误

  • 浮 点 值 的 下 溢 出

  • fmod 函 数

  • signal 函 数

  • 缺 省 信 号

  • 结 束 换 行 字 符

  • 空 行

  • 空 格 字 符

  • 添 加 模 式 中 的 文 件 位 置

  • 截 除 文 本 文 件

  • 文 件 缓 冲

  • 0 长 度 文 件

  • 文 件 名

  • 文 件 访 问 限 制

  • 删 除 打 开 的 文 件

  • 用 一 个 存 在 的 名 称 更 名

  • 读 指 针 值

NULL 宏

  • 读 范 围

  • 文 件 位 置 错 误

  • perror 函 数 产 生 的 消 息

  • 分 配 0 存 储 器

  • abort 函 数

  • atexit 函 数

  • 环 境 名 称

  • system 函 数

  • strerror 函数

  • 时 区

  • clock 函 数

ANSI 4.1.5 宏 NULL 伸 展 为 空 指 针 常 量

几 个 包 括 文 件 定 义 NULL 宏 为 ((void*)0) 。

assert 函 数 打 印 的 诊 断

ANSI 4.2 assert 函 数 打 印 的 诊 断 和 终 止 行 为

assert 函 数 打 印 一 个 诊 断 消 息 , 如 果 该 表 达 式 为 假 (0) 则 调 用 abort 例 程 。 诊 断

消 息 格 式 为 :

assertion failed:expression,file filename, line linenumber

这 里 filename 是 源 文 件 的 名 称 ,linenumber 是 该 源 文 件 中 断 言 失 败 的 行 号 。 如果 该 表 达 式 expression 为 真 ( 非 0), 则 不 发 生 动 作 。

字 符 测 试

ANSI 4.3.1 isalnum 、isalph a、iscntr l、islower 、isprint 和 isupper

函 数 测 试 的 字 符 集

下 表 描 述 了 由 Microsoft C 编 译 器 实 现 的 函 数 。

函数 测试条件

isalnum 字 符 0-9 、 A-Z 、 a-z 、 ASCII 48-57 、 65-90 、 97-122

isalpha 字 符 A-Z 、 a-z 、 ASCII 65-90 、 97-122

iscntrl ASCII 0-31 、 127

islower 字 符 a-z 、 ASCII 97-122

isprint 字 符 A-Z 、 a-z 、 0-9 、标点、空格、 ASCII 32-126

isupper 字 符 A-Z 、 ASCII 65-90

域 错 误

ANSI 4.5.1 数 学 函 数 的 返 回 值 存 在 域 错 误

ERRNO.H 文 件 定 义 域 错 误 常 量 EDOM 为 33 。

浮 点 值 的 下 溢 出

ANSI 4.5.1 在 下 溢 出 范 围 错 误 时 , 数 学 函 数 设 置 表 达 式 errno

为 宏 ERANGE 的 值

一 个 浮 点 下 溢 出 不 设 置 表 达 式 errno 为 ERANGE, 当 一 个 值 接 近 0 并 最 后 下 溢 出 , 这 个 值 设 置 为 0 。

fmod 函 数

ANSI 4.5.6.4 当 fmod 函 数 有 第 二 个 0 参 量 时 出 现 一 个 域 错 误或 返 回 0

当 fmod 函 数 有 第 二 个 0 的 参 量 时 , 该 函 数 返 回 0 。

signal 函 数

ANSI 4.7.1.1 signal 函 数 的 信 号 集

传 给 signal 的 第 一 个 参 量 必 须 是 “ Microsoft Visual C++ 6.0 参 考 库 ” 的 一卷 “ MicrosoftVisual C++6.0 运 行 库 参 量 ” 中 的 信 息 , 还 列 出 了 每 种 信 号 支 持的 操 作 模 式 。 这 些 常 量 也 定 义 在 SIGNAL.H 中 。

缺 省 信 号

ANSI 4.7.1.1 如 果 signal 的 等 价 者 (sig,SIG_DFL )不 在 调 用 一 个信 号 处 理 器 之 前 执 行 ,则 执 行 该 信 号 的 分 块

在 一 个 程 序 开 始 运 行 时 , 信 号 设 置 为 它 们 的 缺 省 状 态 。

结 束 换 行 字 符

ANSI 4.9.2 一 个 文 本 流 的 最 后 行 需 要 一 个 结 束 换 行 字 符

流 函 数 识 别 换 行 或 文 件 结 尾 作 为 一 行 的 结 束 字 符 。

空 行

ANSI 4.9.2 当 读 入 时 出 现 一 个 换 行 字 符 之 前 空 行 是 否 立 即 写入 文 本 流

空 字 符 被 保 留 。

空 格 字 符

ANSI 4.9.2 可 以 添 加 到 写 入 二 进 制 流 中 的 数 据 的 空 字 符 个 数

任 意 个 数 的 空 格 字 符 可 以 添 加 到 一 个 二 进 制 流 中 。

添 加 模 式 中 的 文 件 位 置

ANSI 4.9.3 一 个 添 加 模 式 的 文 件 位 置 指 示 符 初 始 时 是 否 处 于该 文 件 的 结 尾

当 一 个 文 件 以 添 加 模 式 打 开 时 , 文 件 位 置 指 示 符 初 始 地 指 向 文 件 的 结 尾 。

截 除 文 本 文 件

ANSI 4.9.3 在 一 个 文 本 流 上 写 是 否 导 致 关 联 文 件 超 过 这 个 点的 部 分 被 截 除

在 一 个 文 本 流 上 写 不 会 截 除 超 过 这 个 点 的 部 分 。

文 件 缓 冲

ANSI 4.9.3 文 件 缓 冲 特 性

通 过 标 准 I/O 函 数 访 问 的 磁 盘 文 件 都 是 全 缓 冲 的 。 缺 省 地 , 该 缓 冲 区 为 512 个 字节 。

0 长 度 文 件

ANSI 4.9.3 一 个 0 长 度 的 文 件 是 否 实 际 存 在

0 长 度 的 文 件 是 允 许 的 。

文 件 名

ANSI 4.9.3 组 成 有 效 文 件 名 的 规 则

一 个 文 件 格 式 可 以 包 括 一 个 任 选 的 驱 动 器 字 母 ( 后 跟 一 个 符 号 ) 、 一 系 列 任 选 目录 名 称 ( 用 反 斜 杠 分 隔 ) 和 一 个 文 件 名 。

文 件 名 和 目 录 名 可 以 包 含 至 多 8 个 字 符 后 跟 一 个 句 点 以 及 三 个 字 符 的 扩 展 名 。文 件 名 是 大 小 写 无 关 的 。 在 名 称 或 扩 展 名 中 不 允 许 有 通 配 符 * 和 ? 。

文 件 访 问 限 制

ANSI 4.9.3 同 一 文 件 是 否 可 以 多 次 打 开

不 允 许 打 开 一 个 已 打 开 的 文 件 。

删 除 打 开 的 文 件

ANSI 4.9.4.1 remove 函 数 在 一 个 打 开 文 件 上 的 作 用

remove 函 数 删 除 一 个 文 件 , 如 果 该 文 件 是 打 开 的 , 这 个 函 数 失 败 并 返 回 -1 。

用 一 个 存 在 的 名 称 更 名

ANSI 4.9.4.2 如 果 调 用 rename 函 数 之 前 和 新 文 件 名 同 名 的 文件 已 存 在 ,其 结 果 如 何

如 果 你 试 图 使 用 一 个 已 存 在 的 名 称 更 名 一 个 文 件 ,rename 函 数 失 败 并 返 回 一 个错 误 代 码 。

读 指 针 值

ANSI 4.9.6.2 在 fscanf 函 数 中 输 入 % p 的 转 换 。

当 指 定 %p 格 式 字 符 时 ,fscanf 函 数 把 指 针 从 十 六 进 制 ASCII 值 转 换 成 正 确 的 地址 。

读 范 围

如 下 行 :

ANSI 4.9.6.2 在 fscanf 函 数 中 % [ 转 换 的 扫 描 表 中 第 一 个 或 最后 一 个 破 折 号(— — ) 字 符 的 解 释

fscanf(fileptr,"%[A-Z]",strptr);

读 A-Z 范 围 内 的 任 何 数 目 的 字 符 到 strptr 所 指 的 字 符 串 中 。

文 件 位 置 错 误

ANSI 4.9.9.1 , 4.9.9.4 在 失 败 时 fgetpos 或 ftell 函 数 设 置 的 宏

errno 的 值

当 fgetpos 或 ftell 失 败 时 , 如 果 位 置 是 无 效 的 ,errno 设 置 为 EINVAL; 如 果 文 件号 是 坏 的 , 则 errno 设 置 为 EBADF 。 这 些 显 式 常 量 定 义 在 ERRNO.H 中。

perror 函 数 产 生 的 消 息

ANSI 4.9.10.4 由 perror 函 数 产 生 的 消 息

perror 函 数 产 生 这 些 消 息 : 0 Error 0

1

2 No such file or directory 3

4

5

6

7 Arg list too long

8 Exec format error 9 Bad file number 10

11

12 Not enough core 13 Permission denied 14

15

16

17 File exists

18 Cross-device link 19

20

21

22 Invalid argument 23

24 Too many open files 25

26

27

28 No space left on device 29

30

31

32

33 Math argument

34 Result too large 35

36 Resource deadlock would occur

分 配 0 存 储 器

ANSI 4.10.3 如 果 请 求 的 尺 寸 为 0,callo c、 malloc 或 realloc 函数 的 行 为

calloc 、 malloc 和 realloc 函 数 接 受 0 为 参 量 。 不 分 配 实 际 的 存 储 器 , 但 返 回一 个 有 效 指 针 , 该 存 储 器 块 可 以 在 后 面 由 realloc 修 改 。

abort 函 数

ANSI 4.10.4.1 abort 函 数 在 打 开 的 和 临 时 文 件 上 的 行 为

abort 函 数 不 关 闭 打 开 的 或 临 时 的 文 件 。 它 不 刷 新 流 缓 冲 区 。

atexit 函 数

ANSI 4.10.4.3 如 果 参 量 的 值 为 非 0 值 即 EXIT_SUCCESS 或

EXIT_FAILURE,atexit 函 数 的 返 回 状 态

如 果 成 功 ,atexit 函 数 返 回 0; 如 果 不 成 功 , 返 回 非 0 值 。

环 境 名 称

ANSI 4.10.4.4 环 境 名 称 集 和 通 过 getenv 函 数 使 用 的 改 变 环 境表 的 方 法

环 境 名 称 集 是 无 限 制 的 。

为 了 从 一 个 C 程 序 改 变 环 境 变 量 , 调 用 _putenv 函 数 。 为 了 从 Windows 95 或Windows NT 中 的 命 令 行 改 变 环 境 变 量 , 使 用 SET 命 令 ( 例如 ,SET LIB=D:\LIBS) 。从 一 个 C 程 序 设 置 环 境 变 量 仅 在 该 操 作 系 统 命 令 外 壳 的 主 拷 贝 被 运 行 ( 在Windows NT 中为 CMD.EXE, 在 Windows 95 中 为 COMMAND.COM) 时 存 在 。 例 如 , 以下 行 :

system(SET LIB=D:\LIBS);

将 运 行 Windows NT 命 令 外 壳 (CMD.EXE) 的 一 个 拷 贝 , 设 置 环 境 变 量 LIB, 返 回 到 C 程 序 , 并 退 出 CMD.EXE 的 第 二 个 拷 贝 。 退 出 CMD.EXE 的 拷 贝 时 删 除 临 时 环 境 变 量LIB 。

这 个 例 子 也 可 以 在 Windows 95 平 台 上 运 行 。

同 样 ,_putenv 函 数 所 作 的 改 变 仅 延 续 到 该 程 序 终 止 。

system 函 数

ANSI 4.10.4.5 system 函 数 执 行 的 字 符 串 的 内 容 和 模 式

system 函 数 在 一 个 C 程 序 中 而 不 是 命 令 行 执 行 一 个 内 部 操 作 系 统 命 令或 .EXE 、 .COM( 在 Windows 95 中 为 .CMD) 或 .BAT 文 件 。

system 函 数 查 找 命 令 解 释 器 , 在 Windows NT 操 作 系 统 中 为 CMD.EXE, 在 Windows 95 中 为 COMMAND.COM 。 system 函 数 然 后 把 参 量 字 符 串 传 给 该 命 令 解 释 器 。

strerror 函数

ANSI 4.11.6.2 strerror 函 数 返 回 的 错 误 消 息 字 符 串 的 内 容

strerror 函 数 产 生 这 些 消 息 : 0 Error 0

1

2 No such file or directory 3

4

5

6

7 Arg list too long 8 Exec format error 9 Bad file number 10

11

12 Not enough core 13 Permission denied 14

15

16

17 File exists

18 Cross-device link 19

20

21

22 Invalid argument 23

24 Too many open files 25

26

27

28 No space left on device

29

30

31

32

33 Math argument

34 Result too large 35

36 Resource deadlock would occur

时 区

ANSI 4.12.1 本 地 时 区 和 夏 令 时

本 地 时 区 为 太 平 洋 标 准 时 间 。 Microsoft C 支 持 夏 令 时 。

clock 函 数

ANSI 4.12.2.1 clock 函 数 的 时 间

clock 函 数 的 时 间 起 始 ( 从 0 开 始 ) 于 C 程 序 开 始 执 行 。 它 返 回 以1/CLOCKS_PER_SEC( 对 于 Microsoft C 它 等 于 1/1000) 为 单 位 的 时 间 。