为什么GCC会给我-Wjump-misses-init警告?

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.

编辑:无效拼写错误

Sha*_*our 3

在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)。