MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南 MPLAB® C30 C 编译器用户指南

ie.ksu.edu.tw
from ie.ksu.edu.tw More from this publisher
10.07.2015 Views

MPLAB ® C30 用 户 指 南const许 多 函 数 除 了 检 查 自 身 的 参 数 外 不 会 检 查 任 何 其 他 值 , 只 会 影 响 其 返 回 值 。 可 像 算 术运 算 符 一 样 , 对 这 种 函 数 进 行 公 共 子 表 达 式 删 除 和 循 环 优 化 。 这 些 函 数 应 该 用 属 性const 来 声 明 。 例 如 :int square (int) __attribute__ ((const int));也 就 是 说 , 上 述 假 设 的 square 函 数 的 实 际 被 调 用 次 数 即 使 比 程 序 指 定 的 次 数 少 一 些也 是 安 全 的 。应 该 注 意 , 如 果 函 数 有 指 针 参 数 , 且 检 查 指 针 指 向 的 数 据 , 那 么 这 种 函 数 一 定 不 能 用const 声 明 。 同 样 , 调 用 非 const 函 数 的 函 数 通 常 也 不 能 声 明 为 const。 具 有 void 返回 值 类 型 的 const 函 数 没 有 什 么 意 义 。deprecated关 于 deprecated 属 性 的 信 息 , 请 参 阅 第 2.3.1 节 “ 指 定 变 量 的 属 性 ” 。farfar 属 性 告 知 编 译 器 不 应 该 用 更 有 效 的 调 用 指 令 形 式 来 调 用 该 函 数 。format (archetype, string-index, first-to-check)format 属 性 指 定 一 个 函 数 具 有 printf、scanf 或 strftime 类 型 参 数 , 要 根 据 格 式字 符 串 检 查 这 些 参 数 的 类 型 。 例 如 , 考 虑 以 下 声 明 :extern intmy_printf (void *my_object, const char *my_format, ...)__attribute__ ((format (printf, 2, 3)));以 上 语 句 使 编 译 器 检 查 对 my_printf 调 用 中 的 参 数 , 确 定 是 否 与 printf 类 型 的 格式 字 符 串 参 数 my_format 一 致 。参 数 archetype 确 定 如 何 解 释 格 式 字 符 串 , 应 该 为 printf、 scanf 或 strftime之 一 。 参 数 string-index 指 定 哪 个 参 数 是 格 式 字 符 串 参 数 ( 参 数 从 左 至 右 编 号 ,从 1 开 始 ), first-to-check 指 定 根 据 格 式 字 符 串 检 查 的 第 一 个 参 数 的 编 号 。 对 于不 能 检 查 参 数 的 函 数 ( 如 vprintf), 指 定 第 三 个 参 数 为 0。 这 种 情 况 下 , 编 译 器 仅检 查 格 式 字 符 串 的 一 致 性 。在 上 面 的 例 子 中 , 格 式 字 符 串 (my_format) 是 函 数 my_print 的 第 二 个 参 数 , 从第 三 个 参 数 开 始 检 查 , 所 以 format 属 性 的 正 确 参 数 是 2 和 3。format 属 性 允 许 识 别 以 格 式 字 符 串 作 为 参 数 的 用 户 自 定 义 函 数 , 所 以 MPLAB C30 可以 检 查 对 这 些 函 数 的 调 用 有 无 错 误 。 每 当 要 求 这 种 警 告 ( 使 用 -Wformat) 时 , 编 译器 总 会 检 查 ANSI 库 函 数 printf、 fprintf、 sprintf、 scanf、 fscanf、sscanf、 strftime、 vprintf、 vfprintf 和 vsprintf 的 格 式 , 所 以 不 必 修 改头 文 件 stdio.h。DS51284C_CN 第 20 页© 2005 Microchip Technology Inc.

MPLAB C30 与 ANSI C 的 差 别format_arg (string-index)format_arg 属 性 指 定 一 个 函 数 具 有 printf 或 者 scanf 类 型 的 参 数 , 修 改 这 个 函数 ( 如 将 它 翻 译 为 另 外 一 种 语 言 ), 并 把 函 数 的 结 果 传 递 给 printf 或 scanf 类 型 的函 数 。 例 如 , 考 虑 以 下 声 明 :extern char *my_dgettext (char *my_domain, const char *my_format)__attribute__ ((format_arg (2)));上 述 语 句 使 编 译 器 检 查 对 函 数 my_dgettext 的 调 用 中 的 参 数 , 该 函 数 的 结 果 传 递 给printf、 scanf 或 strftime 类 型 函 数 , 确 定 是 否 与 printf 类 型 的 格 式 字 符 串 参数 my_format 一 致 。参 数 string-index 指 定 哪 个 参 数 是 格 式 字 符 串 参 数 ( 从 1 开 始 )。format-arg 属 性 允 许 识 别 修 改 格 式 字 符 串 的 用 户 定 义 函 数 , 所 以 MPLAB C30 可 以检 查 对 printf、 scanf 或 strftime 函 数 的 调 用 , 这 些 函 数 的 操 作 数 是 对 用 户 定 义函 数 的 调 用 。nearnear 属 性 告 知 编 译 器 可 以 使 用 call 指 令 的 更 有 效 形 式 调 用 函 数 。no_instrument_function如 果 指 定 命 令 行 选 项 -finstrument-functions, 那 么 几 乎 所 有 用 户 函 数 的 入 口 和出 口 处 在 编 译 时 都 会 被 插 入 profiling 函 数 。 而 函 数 被 指 定 此 选 项 时 将 不 执 行 上 述 操 作 。noloadnoload 属 性 指 明 应 该 为 函 数 分 配 空 间 , 但 不 应 把 实 际 代 码 装 入 存 储 器 。 如 果 应 用 程 序设 计 为 在 运 行 时 将 函 数 装 入 存 储 器 ( 如 从 EEPROM), 这 一 属 性 很 有 用 。void bar() __attribute__ ((noload)) {...}noreturn一 些 标 准 库 函 数 是 不 能 返 回 的 , 例 如 abort 和 exit。 MPLAB C30 自 动 清 楚 这 种 情况 。 有 些 程 序 自 定 义 了 不 会 返 回 的 函 数 , 我 们 可 以 将 这 些 函 数 声 明 为 noreturn 来 告知 编 译 器 这 种 情 况 。void fatal (int i) __attribute__ ((noreturn));voidfatal (int i){/* Print error message. */exit (1);}noreturn 关 键 字 告 知 编 译 器 fatal 不 会 返 回 。 这 可 以 优 化 代 码 , 而 不 必 考 虑 如 果fatal 返 回 会 怎 样 。 这 可 以 在 某 种 程 度 上 优 化 代 码 。 而 且 这 样 有 助 于 避 免 未 初 始 化 变量 的 假 警 告 。对 于 noreturn 函 数 , 非 void 的 返 回 值 类 型 并 没 有 什 么 意 义 。© 2005 Microchip Technology Inc. DS51284C_CN 第 21 页

MPLAB ® <strong>C30</strong> 用 户 指 南const许 多 函 数 除 了 检 查 自 身 的 参 数 外 不 会 检 查 任 何 其 他 值 , 只 会 影 响 其 返 回 值 。 可 像 算 术运 算 符 一 样 , 对 这 种 函 数 进 行 公 共 子 表 达 式 删 除 和 循 环 优 化 。 这 些 函 数 应 该 用 属 性const 来 声 明 。 例 如 :int square (int) __attribute__ ((const int));也 就 是 说 , 上 述 假 设 的 square 函 数 的 实 际 被 调 用 次 数 即 使 比 程 序 指 定 的 次 数 少 一 些也 是 安 全 的 。应 该 注 意 , 如 果 函 数 有 指 针 参 数 , 且 检 查 指 针 指 向 的 数 据 , 那 么 这 种 函 数 一 定 不 能 用const 声 明 。 同 样 , 调 用 非 const 函 数 的 函 数 通 常 也 不 能 声 明 为 const。 具 有 void 返回 值 类 型 的 const 函 数 没 有 什 么 意 义 。deprecated关 于 deprecated 属 性 的 信 息 , 请 参 阅 第 2.3.1 节 “ 指 定 变 量 的 属 性 ” 。farfar 属 性 告 知 编 译 器 不 应 该 用 更 有 效 的 调 用 指 令 形 式 来 调 用 该 函 数 。format (archetype, string-index, first-to-check)format 属 性 指 定 一 个 函 数 具 有 printf、scanf 或 strftime 类 型 参 数 , 要 根 据 格 式字 符 串 检 查 这 些 参 数 的 类 型 。 例 如 , 考 虑 以 下 声 明 :extern intmy_printf (void *my_object, const char *my_format, ...)__attribute__ ((format (printf, 2, 3)));以 上 语 句 使 编 译 器 检 查 对 my_printf 调 用 中 的 参 数 , 确 定 是 否 与 printf 类 型 的 格式 字 符 串 参 数 my_format 一 致 。参 数 archetype 确 定 如 何 解 释 格 式 字 符 串 , 应 该 为 printf、 scanf 或 strftime之 一 。 参 数 string-index 指 定 哪 个 参 数 是 格 式 字 符 串 参 数 ( 参 数 从 左 至 右 编 号 ,从 1 开 始 ), first-to-check 指 定 根 据 格 式 字 符 串 检 查 的 第 一 个 参 数 的 编 号 。 对 于不 能 检 查 参 数 的 函 数 ( 如 vprintf), 指 定 第 三 个 参 数 为 0。 这 种 情 况 下 , 编 译 器 仅检 查 格 式 字 符 串 的 一 致 性 。在 上 面 的 例 子 中 , 格 式 字 符 串 (my_format) 是 函 数 my_print 的 第 二 个 参 数 , 从第 三 个 参 数 开 始 检 查 , 所 以 format 属 性 的 正 确 参 数 是 2 和 3。format 属 性 允 许 识 别 以 格 式 字 符 串 作 为 参 数 的 用 户 自 定 义 函 数 , 所 以 MPLAB <strong>C30</strong> 可以 检 查 对 这 些 函 数 的 调 用 有 无 错 误 。 每 当 要 求 这 种 警 告 ( 使 用 -Wformat) 时 , 编 译器 总 会 检 查 ANSI 库 函 数 printf、 fprintf、 sprintf、 scanf、 fscanf、sscanf、 strftime、 vprintf、 vfprintf 和 vsprintf 的 格 式 , 所 以 不 必 修 改头 文 件 stdio.h。DS51284C_CN 第 20 页© 2005 Microchip Technology Inc.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!