MICROCHIP MPLAB C32 User Manual

MPLAB® C32
C 编译器
用户指南
2008 Microchip Technology Inc. DS51686A_CN
请注意以下有关 Microchip 器件代码保护功能的要点:
•Microchip的产品均达到 Microchip 数据手册中所述的技术指标。
•Microchip确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一。
目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的 操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。
•Microchip愿与那些注重代码完整性的客户合作。
•Microchip或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。
代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视 为违反了 《数字器件千年版权法案 (Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的
软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。
提供本文档的中文版本仅为了便于理解。请勿忽视文档中包含 的英文部分,因为其中提供了有关 Microchip 产品性能和使用
任何差错不承担任何责任。建议参考 Microchip Technology Inc. 的英文原版文档。
本出版物中所述的器件应用信息及其他类似内容仅为您提供便 利,它们可能由更新之信息所替代。确保应用符合技术规范,
是您自身应负的责任。Microchip 对这些信息不作任何明示或 暗示、书面或口头、法定或其他形式的声明或担保,包括但不
限于针对其使用情况、质量、性能、适销性或特定用途的适用 性的声明或担保。 Microchip 对因这些信息及使用这些信息而
引起的后果不承担任何责任。如果将 Microchip 器件用于生命 维持和 / 或生命安全应用,一切风险由买方自负。买方同意在 由此引发任何一切伤害、索赔、诉讼或费用时,会维护和保障
Microchip 免于承担法律责任,并加以赔偿。在 Microchip 知识 产权保护下,不得暗中或以其他方式转让任何许可证。
商标
Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron dsPIC、 K
EELOQ、 KEELOQ 徽标、 MPLAB、 PIC、
PICmicroPICSTARTPRO MATErfPIC SmartShunt
均为 Microchip Technology Inc. 在美国和其他国家或地区的 注册商标。
FilterLabLinear Active ThermistorMXDEVMXLAB SEEVAL、SmartSensor The Embedded Control Solutions
Company 均为 Microchip Technology Inc. 在美国的注册商
标。
Analog-for-the-Digital AgeApplication Maestro CodeGuarddsPICDEMdsPICDEM.netdsPICworks
dsSPEAKECANECONOMONITORFanSense In-Circuit Serial Programming、 ICSP、 ICEPIC、 Mindi、
MiWiMPASMMPLAB Certified 徽标、MPLIBMPLINK mTouchPICkitPICDEMPICDEM.netPICtailPIC
32
徽标、 PowerCalPowerInfoPowerMatePowerTool REAL ICE、 rfLAB、 Select Mode、 Total Endurance、 UNI/O、WiperLockZENA 均为 Microchip Technology Inc.在
美国和其他国家或地区的商标。 SQTP Microchip Technology Inc. 在美国的服务标记。
在此提及的所有其他商标均为各持有公司所有。
© 2008, Microchip Technology Inc. 版权所有。
Microchip Gresham
印度的设计中心均通过了
MCU与dsPIC® DSC、KEELOQ
设、非易失性存储器和模拟产品方面的质量体系流程均符合
16949:2002
系也已通过了
位于美国亚利桑那州
的全球总部、设计和晶圆生产厂及位于美国加利福尼亚州和
。此外,
ISO 9001:2000
Chandler和Te mp e
ISO/TS-16949:2002
®
跳码器件、串行
Microchip
在开发系统的设计和生产方面的质量体
认证。
与位于俄勒冈州
认证。公司在
EEPROM
®
PIC
、单片机外
ISO/TS-
DS51686A_CN ii  2008 Microchip Technology Inc.
MPLAB® C32 C 编译器
用户指南
目录
前言 ................................................................................................................................. 1
1 章 语言相关信息
1.1 简介 ................................................................................................................ 7
1.2 主要内容 ......................................................................................................... 7
1.3 概述 ................................................................................................................ 7
1.4 文件命名约定 .................................................................................................. 7
1.5 数据存储 ......................................................................................................... 8
1.6 预定义宏 ....................................................................................................... 10
1.7 属性和 Pragma 伪指令 ................................................................................. 11
1.8 命令行选项 ................................................................................................... 15
1.9 通过命令行编译单个文件 .............................................................................. 40
1.10 通过命令行编译多个文件 ............................................................................ 41
2 章 库环境
2.1 简介 .............................................................................................................. 43
2.2 主要内容 ....................................................................................................... 43
2.3 标准 I/O ......................................................................................................... 43
2.4 弱函数 ........................................................................................................... 43
2.5 Helper”头文件 ........................................................................................ 44
2.6 Multilib .......................................................................................................... 44
3 章 中断
3.1 简介 .............................................................................................................. 47
3.2 主要内容 ....................................................................................................... 47
3.3 指定中断处理函数 ......................................................................................... 47
3.4 将中断处理函数与异常向量相关联 ............................................................... 48
3.5 异常处理程序 ................................................................................................ 49
4 章 低级处理器控制
4.1 简介 .............................................................................................................. 51
4.2 主要内容 ....................................................................................................... 51
4.3 通用处理器头文件 ......................................................................................... 51
4.4 处理器支持头文件 ......................................................................................... 51
4.5 外设库函数 ................................................................................................... 52
4.6 特殊功能寄存器访问 ..................................................................................... 53
4.7 CP0 寄存器访问 ............................................................................................ 53
4.8 配置位访问 ................................................................................................... 54
2008 Microchip Technology Inc. DS51686A_CN 第 iii
MPLAB® C32 C 编译器用户指南
5 章 编译器运行时环境
5.1 简介 .............................................................................................................. 57
5.2 主要内容 ....................................................................................................... 57
5.3 寄存器约定 ................................................................................................... 57
5.4 堆栈使用 ....................................................................................................... 58
5.5 堆使用 .......................................................................................................... 59
5.6 函数调用约定 ................................................................................................ 59
5.7 启动和初始化 ................................................................................................ 61
5.8 默认链接描述文件的内容 .............................................................................. 73
5.9 RAM 函数 ..................................................................................................... 85
附录 A 实现定义的操作
A.1 简介 .............................................................................................................. 87
A.2 主要内容 ...................................................................................................... 87
A.3 概述 .............................................................................................................. 87
A.4 翻译 .............................................................................................................. 87
A.5 环境 .............................................................................................................. 88
A.6 标识符 .......................................................................................................... 89
A.7 字符 .............................................................................................................. 89
A.8 整型 .............................................................................................................. 90
A.9 浮点型 .......................................................................................................... 91
A.10 数组和指针 ................................................................................................. 92
A.11 提示 ............................................................................................................ 93
A.12 结构、联合、枚举和位域 ........................................................................... 93
A.13 限定符 ........................................................................................................ 94
A.14 声明符 ........................................................................................................ 94
A.15 语句 ............................................................................................................ 94
A.16 预处理伪指令 ............................................................................................. 94
A.17 库函数 ........................................................................................................ 96
A.18 架构 .......................................................................................................... 101
附录 B 开源许可
B.1 简介 ............................................................................................................ 103
B.2 通用公共许可证 .......................................................................................... 103
B.3 BSD 许可证 ................................................................................................ 103
B.4 Sun Microsystems ...................................................................................... 104
索引 .............................................................................................................................105
全球销售及服务网点 ....................................................................................................116
DS51686A_CN iv 2008 Microchip Technology Inc.
MPLAB® C32 C 编译器
用户指南
前言
客户须知
所有文档均会过时,本文档也不例外。 Microchip 的工具和文档将不断演变以满足客户的需求,因此 实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同。请访问我们的网站
www.microchip.com
文档均标记有 “DS”编号。该编号出现在每页底部的页码之前。 DS 编号的命名约定为
DSXXXXXA”,其中 “XXXXX”为文档编号,“A”为文档版本。
欲了解开发工具的最新信息,请参考 MPLAB
(主题),打开现有在线帮助文件列表。
简介
)获取最新文档。
®
IDE 在线帮助。从 Help (帮助)菜单选择 Topics
本章包含在使用 MPLAB C32 C 编译器之前需要了解的一般信息。本章讨论的内容包 括:
文档编排
本指南中使用的约定
推荐读物
• Microchip 网站
开发系统变更通知客户服务
客户支持
文档版本历史

文档编排

本文档介绍如何使用 MPLAB C32 C 编译器开发工具在目标电路板上仿真和调试固件。 内容安排如下:
1 章 语言相关信息——讨论MPLAB C32 C 编译器命令行的使用、属性、pragma 伪指令和数据表示
2 章库环境——讨论 MPLAB C32 C 库的使用
3 章中断——对中断处理进行概述
4 章 低级处理器控制——讨论 PIC32MX 器件的低级寄存器和配置的访问
5 章 编译器运行时环境——讨论 MPLAB C32 C 编译器的运行时环境
附录 A 实现定义的操作——讨论在 MPLAB C32 C 编译器中,对于“实现定义的操
作”所作的选择
附录 B 开源许可——简要介绍用于 MPLAB C32 C 编译器软件包某些部分的开源许 可证
2008 Microchip Technology Inc. DS51686A_CN 1
MPLAB® C32 C 编译器用户指南

本指南中使用的约定

本手册使用如下文档约定:
文档约定
说明 涵义 示例
Arial 字体: 斜体字 参考书目
需强调的文字 ...
首字母大写 窗口 Output 窗口
对话框 Settings 对话框
菜单选项 选择 Enable Programmer 引号 窗口或对话框中的字段名 Save project before build” 带右尖括号且有下划线的斜体文字菜单路径
粗体字 对话框按钮 单击 OK
选项卡 单击 Power 选项卡
N‘Rnnnn
尖括号 < > 括起的文字 键盘上的按键 <Enter><F1>
Courier New 字体: 常规 Courier New 源代码示例
斜体 Courier New 可变参数 file.o,其 中 file 可以是任
方括号 [ ] 可选参数
花括号和竖线: { | } 选择互斥参数; “或”选择 省略号 ... 代替重复文字
verilog 格式的数,其中 N
数字总数, R 是进制数, n
一个数字。
文件名
文件路径
关键字
命令行选项
位值
常数
表示由用户提供的代码
®
MPLAB
File>Save
4‘b0010, 2‘hF1
#define START autoexec.bat c:\mcc18\h _asm, _endasm, static
-Opa+, -Opa­0, 1 0xFF, ‘A’
一有效文件名
mcc18 [options] file [options]
errorlevel {0|1} var_name [,
var_name...] void main (void)
{ ... }
IDE User’s Guide
仅有
的编译器 ...
DS51686A_CN 2 2008 Microchip Technology Inc.

推荐读物

前言
本用户指南介绍如何使用 MPLAB C32 C 编译器。下面列出了其他有用的文档。 Microchip 提供了如下文档,推荐将这些文档作为补充参考资料。
Readme 文件 关于 Microchip 工具的最新信息,请阅读软件附带的相关 Readme 文件 (HTML
件)。 针对器件的文档
Microchip 网站上提供了许多描述 16 位器件功能和特性的文档,其中包含:
具体器件以及器件系列的数据手册
器件系列的参考手册
程序员参考手册
MPLAB
MPLAB C32 库和预编译目标文件的参考指南。其中列出了随 MPLAB C32 C 编译器提 供的所有库函数,以及它们详细的使用说明。
PIC32MX Configuration Settings PIC32MX 配置设置) 其中列出了 MPLAB C32 C 编译器的 #pragma config 所支持的 Microchip PIC32MS
器件的配置位设置。 C 标准方面的信息
American National Standard for Information Systems – Programming Language – C.
®
C32 C Compiler Libraries DS51685A
American National Standards Institute (ANSI), 11 West 42nd. Street, New York, New York, 10036.
此标准规定了用 C 语言编写程序的格式,并对 C 程序进行了解释。其目的是提高 C 程序在多种计算机系统上的可移植性、可靠性、可维护性及执行效率。
C 语言参考手册
Harbison, Samuel P. and Steele, Guy L., C A Reference Manual,第四版,
Prentice-Hall, Englewood Cliffs, N.J. 07632.
Kernighan, Brian W. and Ritchie, Dennis M., The C Programming Language,第二
版。 Prentice Hall, Englewood Cliffs, N.J. 07632.
Kochan, Steven G., Programming In ANSI C,修订版。 Hayden Books, Indianapolis,
Indiana 46268.
Plauger, P.J., The Standard C Library, Prentice-Hall, Englewood Cliffs, N.J. 07632.
Van Sickle, Ted., Programming Microcontrollers in C,第一版。 LLH Technology
Publishing, Eagle Rock, Virginia 24085.
GCC 文档
http://gcc.gnu.org/onlinedocs/
http://sourceware.org/binutils/
2008 Microchip Technology Inc. DS51686A_CN 第 3
MPLAB® C32 C 编译器用户指南

MICROCHIP 网站

Microchip 网站 (www.microchip.com)为客户提供在线支持。客户可通过该网站方便 地获取文件和信息。只要使用常用的因特网浏览器即可访问。网站提供以下信息:
产品支持——数据手册和勘误表、应用笔记和示例程序、设计资源、用户指南以及 硬件支持文档、最新的软件版本以及存档软件
一般技术支持——常见问题 (FAQ)、技术支持请求、在线讨论组以及 Microchip 顾问计划成员名单
Microchip 业务——产品选型和订购指南、最新 Microchip 新闻稿、研讨会和活动安 排表、 Microchip 销售办事处、代理商以及工厂代表列表
DS51686A_CN 4 2008 Microchip Technology Inc.

开发系统变更通知客户服务

Microchip 的客户通知服务有助于客户了解 Microchip 产品的最新信息。注册客户可在 他们感兴趣的某个产品系列或开发工具发生变更、更新、发布新版本或勘误表时,收 到电子邮件通知。
欲注册,请登录 Microchip 网站 www.microchip.com
Customer Change Notification)”服务并按照注册说明完成注册。
开发系统产品的分类如下:
编译器——Microchip C 编译器及其他语言工具的最新信息,包括 MPLAB C18 MPLAB C30 MPLAB C32 C 编译器、 MPASM™ 和 MPLAB ASM30 汇编器、 MPLINK™ MPLAB LINK30 目标链接器、以及 MPLIB™ MPLAB LIB30 目标
库管理器。
仿真器——Microchip在线仿真器的最新信息,包括MPLAB REAL ICE™和MPLAB ICE 2000 在线仿真器。
在线调试器——Microchip在线调试器的最新信息,包括MPLAB ICD 2和PICkit™ 2。
MPLAB MPLAB IDE 的最新信息,主要针对 MPLAB IDEMPLAB IDE 项目管理器、 MPLAB 编辑器、 MPLAB SIM 模拟器以及一般的编辑和调试功能。
编程器——Microchip 编程器的最新信息,包括 MPLAB PM3 器件编程器以及 PICSTART
®
前言
,点击 “变更通知客户
IDE——关于支持开发系统工具的 Windows®集成开发环境 Microchip
®
PlusPICkit™ 1 PICkit™ 2 开发编程器。

客户支持

文档版本历史

Microchip 产品的用户可通过以下渠道获得帮助:
代理商或代表
当地销售办事处
应用工程师 (FAE
技术支持
客户应联系其代理商、代表或应用工程师 (FAE)寻求支持。当地销售办事处也可为 客户提供帮助。本文档后附有销售办事处的联系方式。
也可通过 http://support.microchip.com
获得网上技术支持。
版本 A 2007 10 月)
本文档的第一版。
2008 Microchip Technology Inc. DS51686A_CN 5
MPLAB® C32 C 编译器用户指南
注:
DS51686A_CN 6 2008 Microchip Technology Inc.

1.1 简介

1.2 主要内容

MPLAB® C32 C 编译器
用户指南

1 章 语言相关信息

本章讨论 MPLAB C32 C 编译器命令行的使用、属性、 pragma 伪指令和数据表示。
本章讨论的内容包括:
概述
文件命名约定
数据存储
预定义宏
属性和 Pragma 伪指令
命令行选项
通过命令行编译单个文件
通过命令行编译多个文件

1.3 概述

编译驱动程序 (pic32-gcc)对 C 和汇编语言模块及库文件进行编译、汇编和链接。 大多数编译器命令行选项对于 GCC 工具集的所有实现都是通用的。只有少数是专门针 对 MPLAB C32 C 编译器的。
编译器命令行的基本形式如下:
pic32-gcc [options] files
在第 1.8 节 “命令行选项”中对可用的选项进行了描述。 例如,下面的命令行编译、汇编和链接 C 源文件 hello.c,生成可执行文件
hello.out
pic32-gcc -o hello.out hello.c

1.4 文件命名约定

编译驱动程序识别如下文件扩展名,文件扩展名要区分大小写。 表 1-1:文
file.c file.h file.i file.o file.s
注: 命令行选项和文件扩展名是区分大小写的。
扩展名 定义
必须预处理的 C 源文件。 头文件 (不对其进行编译或链接)。 已经过预处理的 C 源文件。 目标文件。 汇编语言源文件。
2008 Microchip Technology Inc. DS51686A_CN 7
MPLAB® C32 C 编译器用户指南
1-1:文 (续)
扩展名 定义
file.s
其他 要传递给链接器的文件。

1.5 数据存储

1.5.1 存储尾数表示法
MPLAB C32 C 编译器以小尾数格式存储多字节值。即,最低有效字节存储在最低地 址。
例如, 32 位值 0x12345678 将从地址 0x100 处开始,按如下形式存储:
地址
数据
1.5.2 整型表示
MPLAB C32 C 编译器中的整型值以 2 的补码形式表示,长度为 8 到 64 位。这些值可 在通过 limits.h 编译后的代码中使用。
char, signed char 8 -128 127 unsigned char 8 0 255 short, signed short 16 -32768 32767 unsigned short 16 0 65535 int, signed int, long, signed long 32 -2 unsigned int, unsigned long 32 0 2 long long, signed long long 64 -2 unsigned long long 64 0 264-1
必须预处理的汇编语言源文件。
0x100 0x101 0x102 0x103 0x78 0x56 0x34 0x12
类型 最小值 最大值
31
63
231-1
32
-1
263-1
1.5.3 有符号和无符号字符类型
默认情况下,不带修饰符的 char 类型的值是有符号值。根据 C 标准,这是由实现定义 的操作,有一些环境 元,可以使用命令行选项 -funsigned-char 将默认类型设置为无符号。
1
将不带修饰符的 char 值定义为无符号值。对于给定的翻译单
1.5.4 浮点型表示
MPLAB C32 C 编译器使用 IEEE-754 浮点格式。 float.h 中提供了对于翻译单元的 实现限制的详细信息。
类型
float 32 double 64 long double 64
1.5.5 指针
MPLAB C32 C 编译器中的指针长度均为 32 位。
1. 特别是 PowerPC ARM
DS51686A_CN 第 8 页  2008 Microchip Technology Inc.
1.5.6 limits.h
limits.h 头文件定义了可以使用整型表示的值的范围。
宏名 说明
CHAR_BIT 8 SCHAR_MIN -128
SCHAR_MAX 127
UCHAR_MAX 255
CHAR_MIN
-128 (或 0,参见有 符号和无符号字符类 型)
CHAR_MAX
127 (或 255,参见 有符号和无符号字符 类型)
MB_LEN_MAX 16 SHRT_MIN -32768 SHRT_MAX 32767 USHRT_MAX 65535
31
32
31
-1
-1
31
INT_MIN -2 INT_MAX 2 UINT_MAX 2
LONG_MIN -2 LONG_MAX 231-1 ULONG_MAX 2
LLONG_MIN -2 LLONG_MAX 2
32
63
-1
63
-1
ULLONG_MAX 264-1
最小非位域对象的大小 (以位数表示)。 signed char 类型的对象可能具有的最小
值。 signed char 类型的对象可能具有的最大
值。 unsigned char 类型的对象可能具有的最
大值。
char 类型的对象可能具有的最小值。
char 类型的对象可能具有的最大值。
任何语言环境中的多字节字符的最大长度。
short int 类型的对象可能具有的最小值。 short int 类型的对象可能具有的最大值。 unsigned short int 类型的对象可能具
有的最大值。
int 类型的对象可能具有的最小值。 int 类型的对象可能具有的最大值。 unsigned int 类型的对象可能具有的最大
值。
long 类型的对象可能具有的最小值。 long 类型的对象可能具有的最大值。 unsigned long 类型的对象可能具有的最
大值。
long long 类型的对象可能具有的最小值。 long long 类型的对象可能具有的最大值。 unsigned long long 类型的对象可能具
有的最大值。
语言相关信息
2008 Microchip Technology Inc. DS51686A_CN 9
MPLAB® C32 C 编译器用户指南

1.6 预定义宏

1.6.1 MPLAB C32 C 编译器宏
MPLAB C32 C 编译器定义了许多宏,大多数都带有前缀 “_MCHP_”,它们定义了各 种目标特定选项、目标处理器和主机环境其他方面的特性。
_MCHP_SZINT
_MCHP_SZLONG
_MCHP_SZPTR __mchp_no_float __NO_FLOAT __SOFT_FLOAT
__PIC__ __pic__
__PIC32MX __PIC32MX__
PIC32MX __LANGUAGE_ASSEMBLY
__LANGUAGE_ASSEMBLY__ _LANGUAGE_ASSEMBLY
LANGUAGE_ASSEMBLY
__LANGUAGE_C __LANGUAGE_C__ _LANGUAGE_C
LANGUAGE_C
__processor__
32 64,取决于设置整型大小的命令行选项
-mint32 -mint64)。
32 64,取决于设置整型大小的命令行选项
-mlong32 -mlong64)。
始终为 32,因为所有指针都是 32 位。 如果指定了 -mno-float,则定义该宏。 如果指定了 -mno-float,则定义该宏。 如果未指定 -mno-float,则定义该宏。指示
是否通过库调用浮点型。 将翻译单元编译为位置无关的代码。
始终定义该宏。
如果未指定 -ansi,则定义该宏。 如果是编译经过预处理的汇编文件 (.s
件),则定义该宏。
如果是编译经过预处理的汇编文件 (.s 文 件),并且未指定 -ansi,则定义该宏。
如果是编译 C 文件,则定义该宏。
如果是编译 C 文件,并且未指定 -ansi,则 定义该宏。
其中,“processor”是传递给
-mprocessor 选项的参数的大写形式。例
如, -mprocessor=32mx12f3456 将定 义 __32MX12F3456__
1.6.2 SDE 兼容性宏
MIPS® SDE (软件开发环境)定义了许多宏,大多数带有前缀 “_MIPS_”,它们定 义了各种目标特定选项的特性,其中一些由命令行选项决定 (例如, -mint64)。 在 适用时,这些宏将由 MPLAB C32 C 编译器定义,以方便将应用程序和中间件从 SDE 移植到 MPLAB C32 C 编译器。
_MIPS_SZINT
_MIPS_SZLONG
_MIPS_SZPTR __mips_no_float
DS51686A_CN 10  2008 Microchip Technology Inc.
32 64,取决于设置整型大小的命令行选项
-mint32 -mint64)。
32 64,取决于设置整型大小的命令行选项
-mlong32 -mlong64)。
始终为 32,因为所有指针都是 32 位。 如果指定了 -mno-float,则定义该宏。
语言相关信息
__mips__ _mips _MIPS_ARCH_PIC32MX _MIPS_TUNE_PIC32MX _R3000 __R3000 __R3000__ __mips_soft_float __MIPSEL __MIPSEL__ _MIPSEL
R3000 MIPSEL
_mips_fpr __mips16
__mips16e __mips __mips_isa_rev _MIPS_ISA __mips_single_float

1.7 属性和 PRAGMA 伪指令

始终定义该宏。
如果未指定 -ansi,则定义该宏。
定义为 32。 如果指定了 -mips16 -mips16e,则定义
该宏。 定义为 32。 定义为 2。 定义为 _MIPS_ISA_MIPS32。 如果指定了 -msingle-float,则定义该
宏。

1.7.1 函数属性

always_inline
如果函数声明为 inline,则始终内联函数,即使是未指定任何优化级别。
longcall
始终通过以下方式调用函数:首先将其地址装入一个寄存器,然后使用该寄存器的内 容进行调用。这使得可以调用位于直接调用指令 28 位寻址范围之外的函数。
far
在功能上等价于 longcall
near
始终使用绝对调用指令来调用函数,即使是指定了 -mlong-calls 命令行选项。
mips16
MIPS16 指令集为函数生成代码。
nomips16
始终以 MIPS32 指令集为函数生成代码,即使是编译带有 -mips16 命令行选项的翻译 单元。
interrupt
为用作中断处理程序的函数生成序言 (prologue)和尾声 (epilogue)代码。请参见 第 3 章 “中断”和第 3.5 节 “异常处理程序”。
vector
在所指示的异常向量 (其目标为一个函数)处生成一条转移指令。请参见第 3 章“中 断”和第 3.5 节 “异常处理程序”。
2008 Microchip Technology Inc. DS51686A_CN 11
MPLAB® C32 C 编译器用户指南
at_vector
将函数体放到所指示的异常向量地址处。请参见第 3 章 “中断”和第 3.5 节 “异常处 理程序”。
naked
不为函数生成序言或尾声代码。
section (“name”)
将函数放入由 “name”指定的段。 例如,
void __attribute__ ((section (“.wilma”))) baz () {return;}
函数 baz 将被放入 .wilma 段。
-ffunction-sections 命令行选项对使用 section 属性定义的函数不起作用。
unique_section
将函数放入唯一指定的段中,就如同指定了 -ffunction-sections。如果函数还具 有 section 属性,那么将使用相应的段名作为前缀来生成唯一的段名。
例如,
void __attribute__ ((section (“.fred”), unique_section) foo (void) {return;}
函数 foo 将被放入 .fred.foo 段。
noreturn
向编译器指示,函数将永不返回。在一些情况下,这将使编译器可以在调用函数中生 成效率更高的代码,因为在执行优化时可以无需考虑函数确实会返回时的行为。声明 为 noreturn 的函数的返回类型应始终为 void
noinline
始终不考虑将函数内联。
pure
如果某个函数除了对其返回值之外没有任何其他副面影响,并且返回值仅依赖于参数 和 / 或 (非易变)全局变量,那么对于该函数的调用,编译器可以执行更积极的优化。 此类函数可以使用 pure 属性指示。
const
如果一个 pure 函数仅根据其参数决定其返回值 (即,不检查任何全局变量),那么 可以将其声明为 const,以允许更积极的优化。请注意,对指针参数进行解引用的函 数不属于 const,因为指针解引用使用了不属于参数的值,虽然指针本身是一个参 数。
format (type, format_index, first_to_check)
format 属性指示函数采用 printfscanf、strftime 或 strfmon 样式的格式字符 串和参数,编译器应当根据格式字符串对那些参数进行类型检查,方法与针对标准库 函数时一样。
type 参数是 printfscanf、strftime 或 strfmon 的其中之一(可以选择在两端 附加双下划线,例如, __printf__),决定格式字符串的解释方式。
format_index 参数指定哪个函数参数是格式字符串。函数参数从最左端的参数开 始,从 1 开始编号。
DS51686A_CN 12 2008 Microchip Technology Inc.
语言相关信息
first_to_check 参数指定根据格式字符串检查的第一个参数的编号。如果 first_to_check 0,那么不执行类型检查,编译器仅检查格式字符串的一致性
(例如, vfprintf)。
format_arg (index)
format_arg属性指定函数处理 printf样式的格式字符串,编译器应检查格式字符串 的一致性。用作格式字符串的函数属性使用 index 标识。
nonnull (index, ...)
向编译器指示,传递给函数的一个或多个指针参数必须为非空指针。如果编译器确定 有空指针作为值传递给非空参数,并且指定了 -Wnonnull 命令行选项,那么它会发 出警告诊断信息。
如果未为 nonnull 属性提供任何参数,那么函数的所有指针参数均标记为非空。
unused
向编译器指示,函数可能不使用。如果该函数未被使用,编译器将不会发出警告。
used
向编译器指示,将始终使用该函数,即使编译器无法检查到对该函数的引用,也必须 为函数生成代码。例如,行内汇编代码是到某个静态函数的唯一引用。
deprecated
在使用指定为 deprecated 的函数时,会产生警告。
warn_unused_result
如果调用程序未使用所指示函数的返回值,将会发出警告。
weak
weak 符号指示,如果有另一个版本的相同符号可用,那么应使用另一个版本。例如, 要使已实现的库函数可以由用户编写的函数覆盖,可以使用该属性。
malloc
所指示函数的任何非空指针返回值将不会赋给函数返回时有效的任何其他指针。这使 编译器可以改善优化。
alias (“symbol”)
指示函数是另一个符号的别名。例如,
void foo (void) { /* stuff */ } void bar (void) __attribute__ ((alias(“foo”)));
符号 bar 被视为是符号 foo 的别名。
1.7.2 变量属性
aligned (n)
具有该属性的变量将在下 n 字节边界处对齐。 aligned 属性还可以用于结构成员。此类成员将在结构内对齐到所指示的边界处。 如果省略了对齐值 n,那么变量的对齐值设置为 8 (基本数据类型的最大对齐值)。
2008 Microchip Technology Inc. DS51686A_CN 13
MPLAB® C32 C 编译器用户指南
请注意, aligned 属性是用于增大变量的对齐值,而不是减小它。要减小变量的对齐 值,请使用 packed 属性。
cleanup (function)
指示当具有该属性的自动函数作用域变量超出作用域时要调用的函数。 所指示的函数应只具有一个参数,即指向与具有该属性的变量的类型兼容的指针,返
回类型应为 void
deprecated
在使用指定为 deprecated 的变量时,将会产生警告。
packed
具有该属性的变量或结构成员将具有所可能的最小对齐值。即,将不为声明分配任何 对齐填充存储空间。与 aligned 属性联合使用时, packed 可以用于设置任意的对齐 限制,即大于或小于变量或结构成员的类型所具有的默认对齐值。
section (“name”)
将函数放入由 “name”指定的段。 例如,
unsigned int dan __attribute__ ((section (“.quixote”)))
变量 dan 将被放入 .quixote 段。 除非同时也指定了 unique_section,否则 -fdata-sections 命令行选项对使用
section 属性定义的变量不起作用。
unique_section
将变量放入唯一指定的段中,就如同指定了 -fdata-sections。如果变量还具有 section 属性,那么将使用相应的段名作为前缀来生成唯一的段名。
例如,
int tin __attribute__ ((section (“.ofcatfood”), unique_section)
变量 tin 将被放入 .ofcatfood 段。
transparent_union
如果联合类型的函数形参带有 transparent_union 属性,那么传递相应的实参时, 它的类型视同为联合的第一个成员的类型。
unused
向编译器指示,变量可能不使用。如果该变量未被使用,编译器将不会发出警告。
weak
weak 符号指示,如果有另一个版本的相同符号可用,那么应使用另一个版本。
1.7.3 Pragma 伪指令
#pragma interrupt
将一个函数标记为中断处理程序。函数的序言或尾声代码将执行范围更广的现场保护。 请参见第 3 章 “中断”和第 3.5 节 “异常处理程序”。
#pragma vector
DS51686A_CN 14  2008 Microchip Technology Inc.

1.8 命令行选项

语言相关信息
在所指示的异常向量 (其目标为一个函数)处生成一条转移指令。请参见第 3 章“中 断”和第 3.5 节 “异常处理程序”。
#pragma config
#pragma config 伪指令指定要由应用程序使用的特定于处理器的配置设置 (即,配
置位)。请参见第 4 章 “低级处理器控制”。
MPLAB C32 C 编译器提供了许多控制编译的选项,它们都是区分大小写的。
针对 PIC32MX 器件的选项
控制输出类型的选项
控制 C 语言的选项
控制警告与错误的选项
调试选项
控制优化的选项
控制预处理器的选项
汇编选项
链接选项
目录搜索选项
代码生成约定选项
1.8.1 针对 PIC32MX 器件的选项
1-2:针PIC32MX 器件的选项
选项 定义
-mprocessor
-mips16
-mno-mips16
-mno-float
-msingle-float
-mdouble-float
-mlong64
-mlong32
-G num
选择编译所针对的器件
(例如, -mprocessor=32MX360F512L
生成 (不生成) MIPS16 代码。
不使用浮点库。 假定浮点协处理器仅支持单精度运算。 假定浮点协处理器支持双精度运算。这是默认设置。 强制 long 类型为 64 位宽。关于默认值和确定指针长
度的方式的说明,请参见 -mlong32。 强制 longint pointer 类型为 32 位宽。
intlong pointer 的默认长度为 32 位。 将长度小于等于 num 字节的全局和静态项放入小模式
数据或 bss 段,而不是放入一般数据或 bss 段。这使得 可以使用单条指令对数据进行访问。 所有模块应使用相同的 -G num 值编译。
2008 Microchip Technology Inc. DS51686A_CN 15
MPLAB® C32 C 编译器用户指南
1-2:针PIC32MX 器件的选项 (续)
选项 定义
-membedded-data
-mno-embedded-data
-muninit-const-in-rodata
-mno-uninit-const-in-rodata
-mcheck-zero-division
-mno-check-zero-division
-mmemcpy
-mno-memcpy
-mlong-calls
-mno-long-calls
-mno-peripheral-libs
在可能的情况下,首先将变量分配到只读数据段,然后 在可能的情况下,接着将变量分配到小模式数据段,否 则分配到数据段中。这种情况下生成的代码会比默认情 况下生成的代码略慢,但可以减少在执行时所需的 RAM 量,所以对于一些嵌入式系统可能是更好的选 择。
将非初始化 const 变量放入只读数据段。该选项只有 在与 -membedded-data 联合使用时才有意义。
整数被 0 除时产生 (不产生)陷阱。默认设置为
-mcheck-zero-division。 对于非平凡块移动强制 (不强制)使用 memcpy()
默认设置是 -mno-memcpy,这允许 GCC 内联大多数 固定大小的拷贝。
禁止 (不禁止)使用 jal 指令。使用 jal 调用函数效率 更高,但要求调用程序和被调用程序处于同一个 256 MB 的段中。 该选项对于 abicalls 代码不起作用。默认设置为
-mno-long-calls。 链接时不使用标准外设库。
DS51686A_CN 16 2008 Microchip Technology Inc.
1.8.2 控制输出类型的选项
下面的选项控制编译器的输出类型。 表 1-3 输出类型控制选项
选项 定义
-c
-E
-o file
-S
-v
-x
编译或汇编源文件,但不链接。默认的文件扩展名为 .o。 在预处理过程之后,即正常运行编译器之前停止。默认输出文件为
stdout。 将输出放在 file 中。 在正常编译之后,即调用汇编器之前停止。默认输出文件扩展名为
.s。 在编译的每个阶段打印执行的命令。 可用 -x 选项显式地指定输入语言:
-x
language
为后面的输入文件显式地指定语言 (而不是让编译器根据文件后缀名 选择默认的语言)。该选项适用于其后直到下一个 -x 选项之前的所有 输入文件。 MPLAB C32 C 编译器支持下面的值:
c c-header cpp-output assembler assembler-with-cpp
语言相关信息
--help
-x none
关闭所有语言指定,随后的文件将按其后缀名处理。 -x none 选项是 默认的,但如果已使用另一个 -x 选项,则还必须明确使用 -x none。 例如:
pic32-gcc -x assembler foo.asm bar.asm -x none main.c mabonga.s
没有 -x none 时,编译器将假定所有输入文件都为汇编语言编写的程 序。
打印命令行选项的描述。
2008 Microchip Technology Inc. DS51686A_CN 17
MPLAB® C32 C 编译器用户指南
1.8.3 控制 C 语言的选项
下面的选项定义编译器使用的 C 语言类型。 表 1-4 C 语言控制选项
选项 定义
-ansi
-aux-info filename
-ffreestanding
-fno-asm
-fno-builtin
-fno-builtin-
-fsigned-char
-fsigned-bitfields
-funsigned-bitfields
-fno-signed-bitfields
-fno-unsigned-bitfields
-funsigned-char
-fwritable-strings
function
支持 (且仅支持)所有 ANSI 标准的 C 程序。 对于所有在翻译单元中声明和 / 或定义的函数,包括头文件
中的函数,输出到给定文件名的原型声明中。除了 C,该选 项在其他语言中通常被忽略。除了声明以外,文件在注释中 指出了每个声明的来源 (源文件和行),不论声明是隐含 的、原型的,还是非原型的 (在行号和冒号后面的第一个 字符中, IN 代表新的, O 代表旧的),也不论它来自声 明还是定义 (在随后的字符中,分别用 C F 代表)。如 果是函数定义,在函数声明之后的注释中,还提供 K&R 型 参数列表,后跟这些参数的声明。
指明编译在独立环境中进行。这暗指 -fno-builtin 选 项。独立的环境就是其中可能不存在标准库,程序也不必在 主函数中启动的环境。最显而易见的例子就是 OS 内核。这 与 -fno-hosted 等价。
不识别 asminline typeof 关键字,因此代码可以 将这些单词用作标识符。可以使用关键字
__inline____typeof__
-ansi 暗指 -fno-asm
不识别不以 __builtin_ 作为前缀开始的内建函数。
使 char 型变量为有符号,就像 signed char
(这是默认设置。)
如果声明时未使用 signed unsigned,这些选项用来控制 位域是有符号还是无符号的。默认情况下,这样的位域都是 有符号的,除非使用 -traditional,它使位域总是无符 号的。
使 char 型变量为无符号,就像 unsigned char。 将字符串存储到可写的数据段中,但不要使字符串唯一。
__asm__
DS51686A_CN 18 2008 Microchip Technology Inc.
语言相关信息
1.8.4 控制警告与错误的选项
警告是诊断消息,它报告非本质错误、但有危险的语法结构,或暗示可能存在错误。 可以使用以 -W 开头的选项请求许多特定的警告,例如,使用 -Wimplicit 请求关于
隐式声明的警告。这些特定的警告选项全部可以用以 -Wno- 开头的否定形式来关闭警 告,如 -Wno-implicit。本手册只列出了这两种形式中的一种,这两种形式都不是 默认的。
下面的选项控制 MPLAB C32 C 编译器产生的警告的数量和种类。 表 1-5 -WALL 隐含的警告与错误选项
选项 定义
-fsyntax-only
-pedantic
-pedantic-errors
-w
-Wall
-Wchar-subscripts
-Wcomment
-Wcomments
-Wdiv-by-zero
-Werror-implicit­ function-declaration
-Wformat
-Wimplicit
-Wimplicit-function­ declaration
-Wimplicit-int
-Wmain
-Wmissing-braces
检查代码的语法,除此之外不做任何事情。 发出严格 ANSI C 要求的所有警告。拒绝所有使用禁止扩展名
的程序。 类似于 -pedantic,只是发出错误而不是警告。 禁止所有警告消息。 使能本表中列出的所有 -W 选项。这将使能关于某些用户认为
有问题的,及容易避免的 (或修改来禁止警告的)语法结构 的所有警告,即使是与宏一起。
如果数组下标具有 char 类型则警告。 当注释开始符号 /* 出现在 /* 注释中,或反斜杠 - 换行出现
// 注释中发出警告。 编译时发现整数除以 0 则警告。要禁止这个警告消息,可以
使用 -Wno-div-by-zero。浮点数除以 0 不会警告,因为它 可以是获得无穷大和 NaN 的一种合法方法。
(这是默认设置。)
函数在声明前被使用将给出错误。
检查对 printf scanf 等函数的调用,确保所提供参数的 类型与指定的格式字符串相符合。
等价于同时指定 -Wimplicit-int
-Wimplicit-function-declaration。 函数在声明前被使用将给出警告。
如果声明没有指定类型则警告。 如果 main 的类型有问题则警告。 main 应该是一个具有外部
链接的函数,它返回 int,并带有正确类型的 02 3 个参 数。
如果一个聚集或联合的初始化中括号不全则警告。在下面的 例子中, a 的初始化中括号不全,而对 b 的初始化是正确 的。
int a[2][2] = { 0, 1, 2, 3 }; int b[2][2] = { { 0, 1 }, { 2, 3 } };
2008 Microchip Technology Inc. DS51686A_CN 19
MPLAB® C32 C 编译器用户指南
1-5 -WALL 隐含的警告与错误选项 (续)
选项 定义
-Wmultichar
-Wno-multichar
使用多字符的 character 常量时警告。通常出现这样的常量 是由于输入错误。由于这种常量具有实现定义的值,不应将 它们用在可移植代码中。下面举例说明了多字符 character 常量的使用:
char xx(void) { return('xx'); }
-Wparentheses
-Wreturn-type
-Wsequence-point
在某些上下文中省略圆括号时警告,如在需要真值的上下文 中有一个赋值,或者在运算符嵌套的运算中,人们往往辨别 不清运算的优先级。
当函数定义为其返回值类型默认为 int 时发出警告。如果函 数的返回值类型不是 void,那么不带返回值的任何 return 语句都会导致产生警告。
由于违背 C 标准中的顺序点规则而导致代码中有未定义的语 义时发出警告。 C 标准定义了 C 程序中根据顺序点对表达式求值的顺序,顺 序点代表程序各部分执行的局部顺序:在顺序点之前执行的 部分和顺序点之后执行的部分。这些在一个完整表达式 (不 是一个更大的表达式的一部分)的求值之后,在对第一个运 算符 (&&||?: 或 , (逗号)运算符)求值之后,在调 用函数前 (但在对其参数和表示被调用函数的表达式求值 后),以及某些其他地方发生。除了顺序点规则指定的顺序 外,未指定表达式的子表达式的求值顺序。所有这些规则仅 规定了局部的顺序,而没有规定全局的顺序,因为,如在一 个表达式中调用了两个函数,而它们之间没有顺序点,就没 有指定函数调用的顺序。但是,标准委员会规定函数调用不 能重叠。 没有指定在顺序点之间,对对象的值的修改何时生效。操作依 赖于这一点的程序有不确定的操作; C 标准规定,“在上一 个顺序点和下一个顺序点之间,对象所储存的值最多被表达 式求值修改一次。而且,前一个值是只读的以便确定将被储 存的值。”如果程序违反这些规则,任何特定实现的结果都是 完全不可预估的。 具有未定义操作的代码示例有 a = a++;a[n] = b[n++]a[i++] = i;。该选项不能诊断某些更复杂的情况,并可 能给出偶然错误的结果,但通常在检测程序中的这类问题时, 该选项还是很有效的。
DS51686A_CN 20 2008 Microchip Technology Inc.
1-5 -WALL 隐含的警告与错误选项 (续)
选项 定义
-Wswitch
-Wsystem-headers
-Wtrigraphs
-Wuninitialized
-Wunknown-pragmas
-Wunused
-Wunused-function
-Wunused-label
每当 switch 语句中有一个枚举类型的索引,并且这个枚举 的一个或多个指定码缺少 case 时发出警告。(默认标号的存 在禁止该警告。)当使用该选项时,枚举范围之外的 case 标 号也会引起警告。
打印关于系统头文件中语法结构的警告消息。系统头文件的 警告通常是被禁止的,因为通常认为它们不会有真正的问题, 只会使编译器的输出可读性更差。使用这个命令行选项告知 MPLAB C32 C 编译器发出关于系统头文件的警告,就像在用 户代码中一样。但是,注意将 -Wall 与该选项一起使用时不 会对系统头文件中的未知 pragma 伪指令发出警告。这时,必 须同时使用 -Wunknown-pragmas
遇到三字母组合时发出警告 (假定使能了三字母组合)。 使用自动变量而没有先对其初始化时发出警告。
这些警告只有在允许优化时才出现,因为它们需要只有优化 时才计算的数据流信息。 仅当将变量分配给寄存器时才产生这些警告。因此,对于声 明为 volatile 的变量,或是变量地址被占用,或者大小不 是 124 8 字节的变量不会产生这些警告。同样对于结 构、联合或数组,即使它们在寄存器中,也不会产生这些警 告。 注意,当一个变量只是用于计算一个值而变量本身不会被使 用时,也不会产生警告,因为在警告被打印前,这样的计算 就会被数据流分析删除。
当遇到一个 MPLAB C32 C 编译器无法理解的 #pragma 伪指 令时发出警告。如果使用该命令行选项,甚至对系统头文件 中的未知 pragma 伪指令也会发出警告。如果警告只能通过
-Wall 命令行选项来使能,情况就不是这样了。 每当变量除了其声明外未被使用过时,每当函数声明为 static
但从未定义时,每当声明了标号但未使用时,每当一条语句 的计算结果未被显式使用时,发出警告。 要获得未使用的函数参数的警告,必须同时指定 -W
-Wunused。 强制转换表达式类型可以避免禁止对表达式的这种警告。同 样地, unused 属性可以禁止对未使用的变量、参数和标号 的警告。
每当声明了 static 函数但没有定义函数时,或一个非内联 static 函数未使用时,发出警告。
声明了一个标号但未使用时发出警告。要禁止这种警告,可 以使用 unused 属性。
语言相关信息
2008 Microchip Technology Inc. DS51686A_CN 21
MPLAB® C32 C 编译器用户指南
1-5 -WALL 隐含的警告与错误选项 (续)
选项 定义
-Wunused-parameter
-Wunused-variable
-Wunused-value
当对函数参数进行了声明但从未使用时,发出警告。要禁止 这种警告,可以使用 unused 属性。
当对局部变量或非常量的 static 变量进行了声明但从未使用 时,发出警告。要禁止这种警告,可以使用 unused 属性。
语句的计算结果未显式使用时发出警告。要禁止这种警告, 可以将表达式类型强制转换为 void
DS51686A_CN 22 2008 Microchip Technology Inc.
语言相关信息
下面是不被 -Wall 隐含的 -W 选项。其中有些是关于用户通常认为不会有问题,但有 时希望检查一下的语法结构的警告。其他是在某些情况下必须或很难避免的语法结构 的警告,没有简单的方法来修改代码以禁止这些警告。
1-6 -WALL 不隐含的警告与错误选项
选项 定义
-W
-Waggregate-return
-Wbad-function-cast
为以下事件输出额外警告消息:
非易变的自动变量可能会被对 longjmp 的调用改变。这些
警告仅在优化编译时才会出现。编译器仅识别对 setjmp 的调用,而不会知道将在何处调用 longjmp,信号处理 程序可以在代码中的任何地方调用 longjmp。因此,即 使当实际没有问题时也可能会产生警告,因为实际上不能 在会产生问题的地方调用 longjmp
函数可以通过 return value;return;退出。函数体
结束时不传递任何返回值的语句视为 return;
表达式语句或者逗号表达式的左侧没有副作用。要禁止这种
警告,可以将未使用表达式的类型强制转换为 void。例如, 表达式 x[i,j] 会产生警告,而表达式 x[(void)i,j] 不 会产生警告。
< <= 将无符号值与 0 比较。
出现了像 x<=y<=z 这样的不等式,这等价于 (x<=y ? 1 :
0) <= z,这只是普通数学表示的不同解释罢了。
存储类型修饰符如 static 在声明中没有放在最前面,根
C 标准,这种用法已经过时了。
如果还指定了 -Wall -Wunused,会出现关于未使用变
量的警告。
当将有符号值转换为无符号值时,比较有符号值和无符号
值会产生不正确的结果。(但是如果还指定了
-Wno-sign-compare 的话,就不会产生警告。)
聚集的初始化中括号不全。例如,下面的代码由于在初始
x.h 时漏掉了括号会产生警告: struct s { int f, g; }; struct t { struct s h; int i; }; struct t x = { 1, 2, 3 };
聚集的初始化中没有初始化所有成员。例如,下面的代码
由于 x.h 会被隐式初始化为零而会产生警告: struct s { int f, g, h; }; struct s x = { 3, 4 };
定义或调用了返回结构或联合的任何函数时产生警告。 当将函数调用强制转换为不匹配类型时产生警告。例如,如果
int foof() 被强制转换为任何 * 指针类型会产生警告。
2008 Microchip Technology Inc. DS51686A_CN 23
MPLAB® C32 C 编译器用户指南
1-6 -WALL 不隐含的警告与错误选项 (续)
选项 定义
-Wcast-align
-Wcast-qual
-Wconversion
-Werror
-Winline
-Wlarger-than-len
-Wlong-long
-Wno-long-long
-Wmissing-declarations
-Wmissing­ format-attribute
-Wmissing-noreturn
-Wmissing-prototypes
-Wnested-externs
-Wno-deprecated­ declarations
-Wpadded
-Wpointer-arith
当强制转换指针类型,使目标所需分配的存储空间增加时产生 警告。例如,如果 char * 被强制转换为 int * 会产生警告。
当强制转换指针类型,从目标类型中去除类型限定符时产生警 告。例如,如果 const char * 被强制转换为不带修饰符的 的 char * 会产生警告。
如果一个原型导致一个参数的类型转换与没有原型时不同,则 发出警告。这包括定点型转换为浮点型或反之,及改变定点参 数符号或宽度的转换,与默认的提升相同时除外。 当负的整型常量表达式隐式转换为无符号类型时也发出警告。 例如,如果 x 为无符号类型,赋值 x = -1 将产生警告。但 是,显式的强制类型转换,如 (unsigned) -1,不会产生警 告。
使所有警告变为错误。 一个函数已声明为内联,或指定了 -finline-functions
项时,如果函数不能被内联,将产生警告。 当定义了大于 len 字节的对象时产生警告。 使用 long long 类型时发出警告。这是默认设置。要禁止这
个警告消息,可以使用 -Wno-long-long。仅当使用
-pedantic 标志时,才考虑标志 -Wlong-long
-Wno-long-long
如果全局函数在定义之前没有先对其进行声明会产生警告。即 使定义本身提供了原型,也要在定义全局函数之前先声明它。
如果使能了 -Wformat,可指定 format 属性的函数也会产生 警告。注意这些函数仅是可指定这一属性的函数,并不是已指 定这一属性的函数。如果不使能 -Wformat,该选项不起作 用。
对可指定 noreturn 属性的函数产生警告。这些函数仅是可指 定这一属性的函数,并不是已指定这一属性的函数。手工检验 这些函数时要小心。实际上,在添加 noreturn 属性之前也不 要返回;否则可能会引入微小的代码生成错误。
如果全局函数在定义之前没有先声明原型会产生警告。即使定 义本身提供了原型也会发出这个警告。(该选项可用于检测不 在头文件中声明的全局函数。)
如果在函数内部遇到了 extern 声明,发出警告。 不要对使用通过 deprecated 属性指定为 deprecated 的函
数、变量和类型发出警告。 如果一个结构中包含了填充,不管是为了对齐结构的一个元
素,还是为了对齐整个结构,都发出警告。 对于与函数类型或 void 的长度有关的任何类型发出警告。为
方便使用 void * 指针和指向函数的指针计算, MPLAB C32
C 编译器将这些类型的长度分配为 1
DS51686A_CN 24  2008 Microchip Technology Inc.
1-6 -WALL 不隐含的警告与错误选项 (续)
选项 定义
-Wredundant-decls
-Wshadow
-Wsign-compare
-Wno-sign-compare
-Wstrict-prototypes
-Wtraditional
如果在同一个作用域内多次声明了任何符号则发出警告,即使 多个声明都有效且没有改变任何符号。
当一个局部变量屏蔽另一个局部变量时发出警告。 当将有符号值转换为无符号值,比较有符号值和无符号值产生
不正确的结果时,发出警告。该警告也可通过 -W 来使能。要 获得 -W 的其他警告,而不获得这个警告,可以使用 -W
-Wno-sign-compare。 如果对一个函数的定义或声明没有指定参数类型则发出警告。
(如果函数定义或声明前有指定函数参数类型的声明,则允许
旧式函数定义而不发出警告。) 如果某些语法结构在传统 C ANSI C 中操作不同,产生警
告。
宏参数出现在宏体中的字符串常量中。在传统 C 中,这些
宏参数将替代参数,但在 ANSI C 中是常量的一部分。
在一个块中声明为 external 的函数,在块结束后被使用。
switch 语句有 long 类型的操作数。
非静态函数声明后跟一个静态函数声明。某些传统 C 编译
器不接受这种语法结构。
-Wundef
-Wunreachable-code
-Wwrite-strings
如果在 #if 伪指令中对一个未定义的标识符求值会产生警告。 如果编译器检测到代码将永远不会被执行到则发出警告。
即使在有些情况下,受影响的代码行的一部分能被执行到,该 选项也可能产生警告,因此在删除明显执行不到的代码时要小 心。例如,函数被内联时,警告可能表明仅在函数的一个内联 拷贝中,该行执行不到。
字符串常量类型为 const char[length] 时,将一个字符串 常量的地址复制到一个非常量 char * 指针会产生警告。这些 警告有助于在编译时查找试图写字符串常量的代码,但仅是在 声明和原型中使用 const 时非常小心的前提下。否则,这是 不安全的,这也是 -Wall 为什么不要求这些警告的原因。
语言相关信息
2008 Microchip Technology Inc. DS51686A_CN 25
MPLAB® C32 C 编译器用户指南
1.8.5 调试选项
下面列出了一些用于调试的选项。 表 1-7 调试选项
选项 定义
-g
-Q
-save-temps
产生调试信息。 MPLAB C32 C 编译器支持同时使用 -g -O,因此可以调试优 化的代码。调试优化代码的缺点是有时可能产生异常结果:
某些声明的变量可能根本不存在;
控制流程可能短暂异常转移;
某些语句可能由于计算常量结果或已经获得其值而不执行;
某些语句可能由于被移出循环在不同的地方执行。
尽管如此,证明还是可以调试优化输出的。这使优化可能有错误 的程序变得合理。
使编译器输出它在编译的每个函数名,并在结束时输出关于每遍 编译的一些统计信息。
不要删除中间文件。将中间文件放在当前目录中,并根据源文件 命名它们。因此,用 -c -save-temps 编译 foo.c 将生成下面 的文件:
foo.i (预处理文件) foo.s (汇编语言文件) foo.o (目标文件)
DS51686A_CN 26  2008 Microchip Technology Inc.
Loading...
+ 90 hidden pages