为什么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 或> WC++COMPATA//> >,这在 GCC < /Cord> DOCS部分中包括,并表示:

警告:如果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;
}