10.07.2015 Views

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

MPLAB <strong>C30</strong> 与 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 <strong>C30</strong> 可 以检 查 对 printf、 scanf 或 strftime 函 数 的 调 用 , 这 些 函 数 的 操 作 数 是 对 用 户 定 义函 数 的 调 用 。nearnear 属 性 告 知 编 译 器 可 以 使 用 call 指 令 的 更 有 效 形 式 调 用 函 数 。no_instrument_function如 果 指 定 命 令 行 选 项 -finstrument-functions, 那 么 几 乎 所 有 用 户 函 数 的 入 口 和出 口 处 在 编 译 时 都 会 被 插 入 profiling 函 数 。 而 函 数 被 指 定 此 选 项 时 将 不 执 行 上 述 操 作 。noloadnoload 属 性 指 明 应 该 为 函 数 分 配 空 间 , 但 不 应 把 实 际 代 码 装 入 存 储 器 。 如 果 应 用 程 序设 计 为 在 运 行 时 将 函 数 装 入 存 储 器 ( 如 从 EEPROM), 这 一 属 性 很 有 用 。void bar() __attribute__ ((noload)) {...}noreturn一 些 标 准 库 函 数 是 不 能 返 回 的 , 例 如 abort 和 exit。 MPLAB <strong>C30</strong> 自 动 清 楚 这 种 情况 。 有 些 程 序 自 定 义 了 不 会 返 回 的 函 数 , 我 们 可 以 将 这 些 函 数 声 明 为 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 页

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

Saved successfully!

Ooh no, something went wrong!