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> 用 户 指 南weak 属 性 可 以 应 用 于 函 数 和 变 量 :extern int __attribute__((__weak__))compress_data(void *buf);int process(void *buf) {if (compress_data) {if (compress_data(buf) == -1) /* error */}/* process buf */}在 上 述 代 码 中 , 函 数 compress_data 只 有 在 与 其 他 模 块 链 接 时 才 使 用 。 是 否 使 用 该特 性 是 由 链 接 时 决 定 的 , 而 不 是 由 编 译 时 决 定 的 。weak 属 性 对 定 义 的 影 响 更 为 复 杂 , 需 要 多 个 文 件 加 以 说 明 :/* weak1.c */int __attribute__((__weak__)) i;void foo() {}i = 1;/* weak2.c */int i;extern void foo(void);void bar() {i = 2;}main() {foo();bar();}在 weak2.c 中 对 i 的 定 义 使 符 号 成 为 强 定 义 。 链 接 时 不 会 出 现 错 误 , 两 个 i 指 向 同一 个 存 储 位 置 。 为 weak1.c 中 的 i 分 配 存 储 空 间 , 但 这 个 空 间 不 可 访 问 。不 能 保 证 两 个 程 序 里 的 i 具 有 相 同 的 类 型 , 如 果 将 weak2.c 中 的 i 改 为 float 型 ,仍 然 允 许 链 接 , 但 是 函 数 foo 的 操 作 将 无 法 预 料 。 foo 将 向 32 位 浮 点 值 的 最 低 有 效部 分 写 入 一 个 值 。 相 反 , 在 weak1.c 中 把 i 的 weak 定 义 改 为 float 型 , 将 导 致 灾难 性 结 果 。 这 样 会 把 一 个 32 位 的 浮 点 值 写 到 16 位 的 整 型 地 址 中 , 覆 盖 掉 紧 接 i 之 后存 储 的 任 何 变 量 。在 只 存 在 weak 定 义 的 情 况 下 , 链 接 器 才 选 择 为 第 一 个 这 种 定 义 分 配 存 储 空 间 。 其 他定 义 是 不 可 访 问 的 。无 论 符 号 属 于 什 么 类 型 , 操 作 是 相 同 的 ; 函 数 和 变 量 具 有 相 同 的 操 作 。DS51284C_CN 第 18 页© 2005 Microchip Technology Inc.

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

Saved successfully!

Ooh no, something went wrong!