在 GCC 中,某些警告需要启用优化。例如:
int foo() {
int x;
return x;
}
为了检测未初始化的变量,必须传递-O。
$ gcc -W -Wall -c test.c
$ gcc -W -Wall -c test.c -O
test.c: In function ‘foo’:
test.c:3: warning: ‘x’ is used uninitialized in this function
但是,这可能会干扰调试。有没有一种方法可以仅启用警告所需的分析阶段(不仅仅是这个特定的警告,而是尽可能多的警告),而不会对生成的代码产生太大影响?
我在 x86-64 上使用 GCC 版本 4.3.3 (Ubuntu 4.3.3-5ubuntu4)。
-Wall
而不是 -W
。 -W
已弃用 IIRC。 (正如 Jonathan Leffler 在评论中指出的那样,-W
的替代品是 -Wextra
,而不是 -Wall
。)
-Wunused-variable
每当局部变量或非常量静态变量除了其声明之外未使用时发出警告。此警告由启用。-Wall
此行为在 GCC 4.4 中已发生更改:
未初始化的警告不再需要启用优化,即
可以与-Wuninitialized
一起使用。尽管如此,如果启用优化,-O0
给出的警告可能会更准确。-Wuninitialized
这就是您自动构建的目的。让您的自动构建引擎使用 -Werror -Wall -O2 进行构建,您将捕获更高优化级别触发的所有警告。
DDD 和 GDB 基本上可以处理使用
gcc -O -g
编译的代码。 有时变量并不在您期望的范围内,但 DDD 足够聪明,可以说“优化掉”而不是惊慌失措。 但毫无疑问,关闭 -O 会更容易调试——我在学生的代码中经常看到这种情况。