下面的操作可能会"起作用"1,但这仅仅是因为可用于未定义行为的选项之一是一个看起来起作用的函数.它不会在某个时候随机地"工作",你会感到沮丧.
int sum_up_to_n(int n, int curr_sum) {
if (n == 0) {
return curr_sum;
}
sum_up_to_n(n - 1, n + curr_sum);
}
但还有希望!如果我在启用警告的情况下编译它,我们可以看到编译器发现了这个bug.
$ cat test.c
int sum_up_to_n(int n, int curr_sum) {
if (n == 0) {
return curr_sum;
}
sum_up_to_n(n - 1, n + curr_sum);
}
$ gcc -c -Wall -Wextra -Wpedantic test.c
test.c: In function ‘sum_up_to_n’:
test.c:6:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
可以忽略(但不应该).如果我告诉编译器处理as个警告错误,它们就不能再被忽略了.
$ gcc -c -Wall -Wextra -Wpedantic test.c -Werror
test.c: In function ‘sum_up_to_n’:
test.c:6:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1: all warnings being treated as errors
在启用警告的情况下编译将帮助您捕获代码中的许多其他潜在问题.请记住,如果你收到了一长串警告或错误来解决第一个first,然后重新编译.随后的问题可能已经从第一个问题中级联下来,"修复"随后的问题可能没有必要,甚至可能
有害.
[1]这里的"工作"是指"不能检测到故障"."