GCC 中文手册(中)
-Wparentheses
在某些情况下如果忽略了括号
,
编译器就发出警告
.
-Wtemplate-debugging
当在
C++
程序中使用
template
的时候
,
如果调试
(debugging)
没有完全生效
,
编译器就发出警告
. (
仅用于
C++).
-Wall
结合所有上述的
`-W'
选项
.
通常我们建议避免这些被警告的用法,我们相信
,
恰当结合宏的使用能够 轻易避免这些用法。
-Wparentheses
剩下的`-W...'选项不包括在`-Wall'中,因为我们认为在必要情况下,这些被编译器警告 的程序结构,可以合理的用在"干净的"程序中.
-
-Wtraditional
- 如果某些程序结构在传统 C 中的表现和 ANSI C 不同 , 编译器就发出警告 . *
- 宏参出现在宏体的字符串常量内部 . 传统 C 会替换宏参 , 而 ANSI C 则视其为常量的一部分 . *
- 某个函数在块 (block) 中声明为外部 , 但在块结束后才调用 . *
- switch 语句的操作数类型是 long.
-
-Wshadow
- 一旦某个局部变量屏蔽了另一个局部变量 , 编译器就发出警告 . -Wid-clash-len
- 一旦两个确定的标识符具有相同的前 len 个字符 , 编译器就发出警告 . 他可以协助你开发一些将要在某些 过时的 , 危害大脑的编译器上编译的程序 . -Wpointer-arith
- 任何语句如果依赖于函数类型的大小 (size) 或者 void 类型的大小 , 编译器就发出警告 . GNU C 为了 便于计算 void * 指针和函数指针 , 就把这些类型的大小定义为 1. -Wcast-qual
- 一旦某个指针强制类型转换以便移除类型修饰符时 , 编译器就发出警告 . 例如 , 如果把 const char * 强制转换为普通的 char * 时 , 警告就会出现 . -Wcast-align
- 一旦某个指针类型强制转换时 , 导致目标所需的地址对齐 (alignment) 增加 , 编译器就发出警告 . 例如 , 某些机器上 只能在 2 或 4 字节边界上访问整数 , 如果在这种机型上把 char * 强制转换成 int * 类型 , 编译器就发出警告 . -Wwrite-strings
- 规定字符串常量的类型是 const char[length], 因此 , 把这样的地址复制给 non-const char * 指针将产生警告 . 这些警告能够帮助你在编译期间发现企图写入字符串常量 的代码 , 但是你必须非常仔细的在声明和原形中使用 const, 否则他们只能带来麻烦 ; 所以我们没有让 `-Wall' 提供这些警告 . -Wconversion
- 如果某函数原形导致的类型转换和无函数原形时的类型转换不同 , 编译器就发出警告 . 这里包括定点数和浮点数的 互相转换 , 改变定点数的宽度或符号 , 除非他们和缺省声明 (default promotion) 相同 . -Waggregate-return
- 如果定义或调用了返回结构或联合的函数 , 编译器就发出警告 . ( 从语言角度你可以返回一个数组 , 然而同样会 导致警告 .) -Wstrict-prototypes
- 如果函数的声明或定义没有指出参数类型 , 编译器就发出警告 . ( 如果函数的前向引用说明指出了参数类型 , 则允许后面 使用旧式风格的函数定义 , 而不会产生警告 .) -Wmissing-prototypes
- 如果没有预先声明函数原形就定义了全局函数 , 编译器就发出警告 . 即使函数定义自身提供了函数原形也会产生这个警告 . 他的目的是检查没有在头文件中声明的全局函数 . -Wmissing-declarations
- 如果没有预先声明就定义了全局函数 , 编译器就发出警告 . 即使函数定义自身提供了函数原形也会产生这个警告 . 这个选项 的目的是检查没有在头文件中声明的全局函数 . -Wredundant-decls
- 如果在同一个可见域某定义多次声明 , 编译器就发出警告 , 即使这些重复声明有效并且毫无差别 . -Wnested-externs
- 如果某 extern 声明出现在函数内部 , 编译器就发出警告 . -Wenum-clash
- 对于不同枚举类型之间的转换发出警告 ( 仅适用于 C++). -Wlong-long
- 如果使用了 long long 类型就发出警告 . 该警告是缺省项 . 使用 `-Wno-long-long' 选项能够防止这个警告 . `-Wlong-long' 和 `-Wno-long-long' 仅在 `-pedantic' 之下才起作用 . -Woverloaded-virtual
- ( 仅适用于 C++.) 在继承类中 , 虚函数的定义必须匹配虚函数在基类中声明的类型特征 (type signature). 当 继承类声明了某个函数 , 它可能是个错误的尝试企图定义一个虚函数 , 使用这个选项能够产生警告 : 就是说 , 当某个函数和基类 中的虚函数同名 , 但是类型特征不符合基类的任何虚函数 , 编译器将发出警告 . -Winline
- 如果某函数不能内嵌 (inline), 无论是声明为 inline 或者是指定了 -finline-functions 选项 , 编译器都将发出警告 . -Werror
- 视警告为错误 ; 出现任何警告即放弃编译 .
调试选项(DEBUGGING OPTION)
GNU CC 拥有许多特别选项 , 既可以调试用户的程序 , 也可以对 GCC 排错 :-
-g
-
以操作系统的本地格式
(stabs, COFF, XCOFF,
或
DWARF).
产生调试信息
. GDB
能够使用这些调试信息
.
在大多数使用stabs格式的系统上, `-g'选项启动只有GDB才使用的额外调试信息;这些信息使GDB 调试效果更好,但是有可能导致其他调试器崩溃,或拒绝读入程序.如果你确定要控制是否生成额外的信息, 使用`-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf+',或`-gdwarf' (见下文).
和大多数C编译器不同, GNU CC允许结合使用`-g'和`-O'选项.优化的代码偶尔制造 一些惊异的结果:某些声明过的变量根本不存在;控制流程直接跑到没有预料到的地方;某些语句因为计算结果是常量或已经确定而 没有执行;某些语句在其他地方执行,因为他们被移到循环外面了.
然而它证明了调试优化的输出是可能的.对可能含有错误的程序使用优化器是合理的.
如果GNU CC支持输出多种调试信息,下面的选项则非常有用.
-
-ggdb
- 以本地格式 ( 如果支持 ) 输出调试信息 , 尽可能包括 GDB 扩展 . -gstabs
- 以 stabs 格式 ( 如果支持 ) 输出调试信息 , 不包括 GDB 扩展 . 这是大多数 BSD 系统上 DBX 使用的格式 . -gstabs+
- 以 stabs 格式 ( 如果支持 ) 输出调试信息 , 使用只有 GNU 调试器 (GDB) 理解的 GNU 扩展 . 使用这些扩展有可能导致 其他调试器崩溃或拒绝读入程序 . -gcoff
- 以 COFF 格式 ( 如果支持 ) 输出调试信息 . 这是在 System V 第四版以前的大多数 System V 系统上 SDB 使用的 格式 . -gxcoff
- 以 XCOFF 格式 ( 如果支持 ) 输出调试信息 . 这是 IBM RS/6000 系统上 DBX 调试器使用的格式 . -gxcoff+
- 以 XCOFF 格式 ( 如果支持 ) 输出调试信息 , 使用只有