跳到主要内容

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