3.7 控制诊断消息
KF32工具链以警告和错误的形式提供诊断信息。您可以使用选项来抑制这些信息,或将其设置为警告或错误。
KF32工具链会列出其在编译和链接过程中遇到的所有警告和错误。但是,如果你指定了多个源文件,该编译器仅会报告它在其中遇到错误的第一个源文件的诊断信息。
kf32clang的消息格式
kf32clang生成的消息格式如下:
文件:行:列:类型:消息
文件
包含错误或警告的文件名
行号
包含错误或警告的行号
列
生成消息的列号
类型
消息的类型,例如错误或者警告
消息
消息文本。
一个错误诊断消息示例如下:
test.c:4:3: error: use of undeclared identifier 'x'
x = 5;
1 error generated.
此错误消息包括:
- 包含问题的文件名为test.c
- 问题出在test.c的第4行,从第3个字符开始
- 该错误与变量x有关
以下是控制kf32clang诊断输出的常用选项。
表3.6 常用诊断选项
| 选项 | 描述 |
|---|---|
| -Wall | 开启大部分常见警告 |
| -Werror | 将所有警告转为错误 |
| -Werror=foo | 只针对特定类型的警告 |
| -Wno-error=foo | 把特定警告恢复为普通警告,即不当作错误 |
| -Wfoo | 用来开启特定类型的警告 |
| -Wno-foo | 禁用 foo 类型的警告 |
| -w | 所有警告信息都会被完全屏蔽 |
| -Weverything | 开启kf32clang支持的所有警告 |
| -pedantic | 使用了非标准C/C++时产生警告 |
诊断消息示例
示例代码test.c如下,其中故意包含两处问题:printf的格式说明符多于实参,以及调用了未声明的函数call。编译后,kf32clang会分别给出对应的诊断消息。
#include <stdlib.h>
#include <stdio.h>
void function(int x) {
int i;
int y = i + x;
printf("Result of %d plus %d is %d\n");
call();
return;
}
使用以下命令编译test.c:
kf32clang --target=kf32r -march=kf32r -c test.c
默认情况下,kf32clang会检查printf()语句的格式,以确保%格式说明符的数量与数据参数的数量相匹配。因此,kf32clang会生成此诊断消息:
test.c:7:24: warning: more '%' conversions than data arguments [-Wformat-insufficient-args]
printf("Result of %d plus %d is %d\n");
~^
示例未显式指定源语言标准。C99及之后的标准不允许隐式函数声明,因此kf32clang会生成此诊断消息:
test.c:8:5: warning: implicit declaration of function 'call' is invalid in C99 [-Wimplicit-function-declaration]
call();
^
要抑制所有警告,请使用-w:
kf32clang --target=kf32r -march=kf32r -c test.c -w
要仅抑制-Wformat 警告,请使用-Wno-format:
kf32clang --target=kf32r -march=kf32r -c test.c -Wno-format
默认情况下,有些诊断消息会被抑制。要查看所有诊断消息,请使用 -Weverything:
kf32clang --target=kf32r -march=kf32r -c test.c -Weverything