MPLAB ® <strong>C30</strong> 用 户 指 南MPLAB <strong>C30</strong> 可 以 采 用 非 邻 近 的 方 式 分 配 复 数 自 动 变 量 , 甚 至 可 以 将 实 部 分 配 到 寄 存 器中 , 而 将 虚 部 分 配 到 堆 栈 中 , 反 之 亦 然 。 调 试 信 息 格 式 无 法 表 示 这 种 非 邻 近 的 分 配 ,所 以 MPLAB <strong>C30</strong> 把 非 邻 近 的 复 数 变 量 描 述 为 两 个 独 立 的 非 复 数 类 型 变 量 。 如 果 实 际变 量 名 是 foo, 那 么 两 个 假 设 变 量 命 名 为 foo$real 和 foo$imag。2.3.6 双 字 整 型MPLAB <strong>C30</strong> 支 持 长 度 为 long int 两 倍 的 整 型 数 据 类 型 。 对 于 有 符 号 整 型 , 写 longlong int, 而 对 于 无 符 号 整 型 , 使 用 unsigned long long int。 可 以 通 过 在 整 型上 添 加 后 缀 LL 得 到 long long int 类 型 的 整 型 常 量 , 在 整 数 上 添 加 后 缀 ULL 得 到unsigned long long int 类 型 的 整 型 常 量 。可 以 在 算 术 运 算 中 像 使 用 其 他 整 型 一 样 使 用 这 些 类 型 。 这 些 数 据 类 型 的 加 、 减 和 位 逻辑 布 尔 运 算 是 开 放 源 代 码 的 , 但 是 , 这 些 数 据 类 型 的 除 法 与 移 位 不 是 开 放 源 代 码 的 。这 些 不 开 放 源 代 码 的 运 算 要 使 用 MPLAB <strong>C30</strong> 自 带 的 特 殊 库 函 数 。2.3.7 用 typeof 引 用 类 型引 用 表 达 式 类 型 的 另 一 种 方 法 是 使 用 typeof 关 键 字 。 使 用 这 个 关 键 字 的 语 法 与sizeof 相 似 , 但 是 其 结 构 在 语 义 上 类 似 于 用 typedef 定 义 的 类 型 名 。有 两 种 方 法 写 typeof 的 参 数 : 使 用 表 达 式 或 者 使 用 类 型 。 以 下 为 使 用 表 达 式 的 例子 :typeof (x[0](1))这 里 假 设 x 是 函 数 数 组 , 描 述 的 类 型 就 是 函 数 值 的 类 型 。以 下 为 使 用 类 型 名 作 为 参 数 的 例 子 :typeof (int *)这 里 , 描 述 的 类 型 是 指 向 int 的 指 针 。如 果 写 一 个 包 含 在 ANSI C 程 序 中 时 必 须 有 效 的 头 文 件 , 要 使 用 __typeof__, 而 不要 使 用 typeof。typeof 结 构 可 用 于 可 使 用 typedef 名 的 任 何 地 方 。 例 如 , 可 以 在 声 明 和 强 制 类 型 转换 中 , 或 者 sizeof 或 typeof 的 内 部 使 用 它 。• 用 x 指 向 的 类 型 声 明 y:typeof (*x) y;• 将 y 声 明 为 这 种 值 的 数 组 :typeof (*x) y[4];• 将 y 声 明 为 指 向 字 符 的 指 针 数 组 :typeof (typeof (char *)[4]) y;它 等 同 于 如 下 的 传 统 C 声 明 :char *y[4];为 了 弄 清 楚 typeof 声 明 的 含 义 , 以 及 为 什 么 是 有 用 的 方 法 , 我 们 用 以 下 宏 改 写 它 :#define pointer(T) typeof(T *)#define array(T, N) typeof(T [N])现 在 声 明 可 以 这 样 改 写 :array (pointer (char), 4) y;这 样 , array (pointer (char), 4) 是 指 向 char 的 四 个 指 针 的 数 组 类 型 。DS51284C_CN 第 26 页© 2005 Microchip Technology Inc.
MPLAB <strong>C30</strong> 与 ANSI C 的 差 别2.4 语 句 差 别本 节 讲 述 普 通 ANSI C 与 MPLAB <strong>C30</strong> 所 接 受 C 之 间 的 语 句 差 别 。 语 句 差 别 是 基 本GCC 实 现 的 一 部 分 , 本 节 讨 论 的 内 容 基 于 标 准 GCC 文 档 , 选 择 了 GCC 中 MPLAB<strong>C30</strong> 部 分 的 特 定 语 法 和 语 义 来 讲 述 。• 将 标 号 作 为 值• 省 略 操 作 数 的 条 件 表 达 式• case 范 围2.4.1 将 标 号 作 为 值可 以 用 单 目 运 算 符 “&&” 获 得 在 当 前 函 数 ( 或 包 含 函 数 ) 中 定 义 的 标 号 的 地 址 。 值 的类 型 为 void *。 这 个 值 为 常 量 , 并 可 在 这 种 类 型 的 常 量 有 效 的 任 何 地 方 使 用 这 个 值 。例 如 :void *ptr;...ptr = &&foo;为 使 用 这 些 值 , 需 要 能 跳 转 到 值 。 这 通 过 相 对 goto 语 句 goto *exp; 来 实 现 。 例 如 :goto *ptr;可 使 用 void * 类 型 的 任 何 表 达 式 。这 些 常 量 的 一 个 用 途 是 用 于 初 始 化 用 作 跳 转 表 的 静 态 数 组 :static void *array[] = { &&foo, &&bar, &&hack };然 后 就 可 以 通 过 索 引 来 这 样 选 择 标 号 :goto *array[i];注 : 这 并 不 检 查 下 标 是 否 超 出 范 围 (C 中 的 数 组 索 引 从 不 这 样 做 )。这 种 标 号 值 数 组 的 用 途 与 switch 语 句 很 类 似 。 switch 语 句 更 整 齐 , 比 数 组 更 好 。标 号 值 的 另 外 一 个 用 途 是 在 线 程 代 码 的 解 释 程 序 中 。 解 释 程 序 函 数 中 的 标 号 可 存 储 在线 程 代 码 中 用 于 快 速 调 度 。这 种 机 制 可 能 被 错 误 使 用 , 而 跳 转 到 其 他 函 数 的 代 码 中 。 编 译 器 不 能 阻 止 这 种 现 象 的发 生 , 因 此 必 须 小 心 , 确 保 目 标 地 址 对 于 当 前 函 数 有 效 。© 2005 Microchip Technology Inc. DS51284C_CN 第 27 页