附 录 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) 为 单 位 的 时 间 。