C核心技术手册(四十三)

18.5 编译警告

当编译一个C程序时,有两类麻烦,一是错误信息,这使用你不能完成编译;另一种是警告,它提示你应该遵循严格的标准,便不会中止编译,你也可以不用理会驼些告警,直接运行程序,但这不是一个好主意。

GCC提供非常好的警告控制,例如,你不喜欢区分错误和警告,可以使用-Werror选项使用GCC在出现任务警告时停止编译,就跟出现错误一样。其他的选项支持古老的或非标准的告警控制。

使用选项-W可以启用GCC个别的告警,例如,选项-Wswitch-default提示GCC当使用了switch语句,但没有带default标签时出现一个警告。

使用GCC中的这些警告最简单的方法是在命令行中使用-Wall选项,然而,这个选项的名子容易使用人误解,-Wall并不启用所有独立的-W选项,许多警告要求使用时指定名称,例如-Wshadow,此选项在使用块域定义一个变量,当具有相同的名子时产生一个告警,这些告警-Wall选项是不能产生的。

使用-Wall选项,且想禁止掉部分警告,可以在-W选项所带的告警名称前面插入no-,因此-Wno-switch-default将关闭告警,这样在使用switch语句且没有带default标签时将不会道理生警告。此外,-w (小写字母)选项将关闭所有告警。

选项-WexTRa增加许多合法但可疑的表达式相关告警,例如,测试一个无符号值是负数还非负数:

unsigned int u;

/* ... */

if ( u < 0 )

{ /* ... this block is never executed ... */ }

选项-Wextra会产生告警提示表达式没有副作用且结果将被丢弃,所有它可以检查的条件全集在GCC手册中有描述。

此外,如果你更新古老的程序,可能会使用-WTRaditional选项来产生告警,因为这些在旧风格的CISO 标准C中具有不同的含义,例如,一个在宏中使用的字符串,且包含一个参数:

#define printerror(x) fputs("x/n", stderr)

在传统的旧的C中,此宏正常工作,但在ISO 标准C中,它将打印出一个字母x和一个换行符,因此-WTRaditional选项将对此行产生下面的警告:

file:line:column: warning: macro argument "x" would be stringified in traditional C

你可能感兴趣的:(技术)