为什么GCC会给我-Wjump misses init警告?
我有一段代码以这种形式编写时编译得很好(带有为什么GCC会给我-Wjump misses init警告?,c,compiler-warnings,C,Compiler Warnings,我有一段代码以这种形式编写时编译得很好(带有-Wjump misses init标志): 但是,当我以这种形式编写相同的函数时,当我编译(: 当我在同一行上声明并初始化a时,为什么GCC会给我这个警告?我觉得有点奇怪?这些例子毫无意义,但我恐怕不能随意透露真正的代码片段。我正在Debian Wheezy 7.3上运行GCC 4.7.2 编辑:C++中的空洞类型< /p> 不允许,但在C99中允许使用. GCC < /代码>警告,如果您使用 -WSCALL init 或> WC++COMPATA/
-Wjump misses init
标志):
但是,当我以这种形式编写相同的函数时,当我编译(:
当我在同一行上声明并初始化a
时,为什么GCC会给我这个警告?我觉得有点奇怪?这些例子毫无意义,但我恐怕不能随意透露真正的代码片段。我正在Debian Wheezy 7.3上运行GCC 4.7.2
<>编辑:C++中的空洞类型< /p> 不允许,但在C99中允许使用.<代码> GCC < /代码>警告,如果您使用<代码> -WSCALL init 或警告:如果GOTO语句或转换语句在变量初始化时跳到前面,或者在变量初始化后跳回到标签。这只警告在声明时初始化的变量。C++和Objto-C只支持此警告;在C++中,这种分支是A中的错误。纽约案例
-Wjump misses init包含在-Wc++-compat中。可以使用-Wno jump misses init选项禁用它 注意,这也适用于switch语句中的声明。解决这一问题的一种方法是使用{}
创建一个新的作用域
在附件一中,委员会建议将此作为警告,它说:
在许多情况下,实现可能会生成警告,但没有一种情况是正确的
作为本国际标准的一部分规定。以下是其中一些
常见情况
并包括以下项目符号:
跳转具有自动存储持续时间的对象初始化的块
进入(6.2.4)
如果您在使用<代码> >错误:标签时使用“<代码> < /Cord>变量”,其值将是不确定的(6 .2.4 p6);这可能是令人困惑的,这就是GCC警告它的原因。(在C++中也是非法的)
为了避免出现警告并仍然使用声明初始化,可以将代码包装在块中:int some_function(void) {
{
...
if (is_error)
goto error;
int a = 1;
return a;
}
error:
return 666;
}
在此情况下,您需要在块外声明您在C++中使用的任何变量:标签> ./P>在C++中,但是在C99中找不到相同的语句。我怀疑错误是否用不同的优化标志来保存。或者如果程序集不同。nt。不过这只是一个猜测。而且,
int void
看起来是个打字错误。@ShafikYaghmour哦,好的,我把这部分从我的评论中删掉了。@ShafikYaghmour不,我用gcc test.cInteresting编译,-Wjump misses init
不在我的gcc版本(4.8.1,Ubuntu 12.04)的-Wc++-compat
中.它被删除了吗?@ecatmur hmmm,在4.8
中似乎是这样,尽管4.7
仍然有它。
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
int some_function(void) {
{
...
if (is_error)
goto error;
int a = 1;
return a;
}
error:
return 666;
}