c00*_*ter 7 c compiler-warnings
我有一段代码,当我以这种形式(带有-Wjump-misses-init标志)写它时编译得很好:
int some_function(void) {
...
if (is_error)
goto error;
int a;
a = 1;
return a;
error:
return 666;
}
Run Code Online (Sandbox Code Playgroud)
但是当我以这种形式编写相同的函数时,我在编译时得到以下警告(:
int some_function(void) {
...
if (is_error)
goto error;
int a = 1;
return a;
error:
return 666;
}
test.c: In function 'some_function':
test.c:15:17: warning: jump skips variable initialization [-Wjump-misses-init]
test.c:21:1: note: label 'error' defined here
test.c:17:13: note: 'a' declared here
Run Code Online (Sandbox Code Playgroud)
当我a在同一行宣布和初始化时,为什么GCC会给我这个警告?对我来说似乎有点奇怪?这些例子是荒谬的,但我担心我不能自由地泄露真正的代码片段.我在Debian Wheezy 7.3上运行GCC 4.7.2.
编辑:无效拼写错误
在C++中,不允许通过初始化绕过声明,但在C99中似乎是允许的。如果您使用或 ,您可以发出gcc 警告。文档部分“请求或抑制警告的选项”对此进行了介绍,并指出:-Wjump-misses-init-Wc++-compatgcc
如果 goto 语句或 switch 语句向前跳转到变量的初始化,或者在变量初始化后向后跳转到标签,则发出警告。这仅警告声明时初始化的变量。此警告仅支持 C 和 Objective-C;在 C++ 中,这种分支无论如何都是错误的。
-Wjump-misses-init 包含在 -Wc++-compat 中。可以使用 -Wno-jump-misses-init 选项禁用它。
请注意,这也适用于switch语句内的声明。解决此问题的一种方法是使用创建一个新范围{}。
在附件一中,C99 标准草案建议将此作为警告,它说:
实施可能会在许多情况下生成警告,但本国际标准中没有指定任何一种情况。以下是一些较常见的情况。
并包括以下项目符号:
具有自动存储持续时间的对象初始化的块被跳转到(6.2.4)。