为什么我得到"标签只能是声明的一部分而声明不是声明"如果我有一个在标签后初始化的变量?

时间:2013-08-28 19:09:50

标签: c gcc

我有以下简化代码:

#include <stdio.h>
int main () 
{
    printf("Hello ");
    goto Cleanup;
Cleanup:
    char *str = "World\n";
    printf("%s\n", str);
}

我收到错误,因为在标签后面声明了一个新变量。如果我将标签后的内容(主要是初始化)放在{}块中,则编译成功。

我认为我理解在切换时阻塞的原因,但为什么它应该适用于标签?

此错误来自gcc编译器

2 个答案:

答案 0 :(得分:111)

语言标准根本不允许。标签只能跟在语句后面,而声明不能算作C中的语句。解决这个问题的最简单方法是在标签后插入一个空语句,这样可以使你无法按照你需要的方式跟踪范围。在一个街区内。

#include <stdio.h>
int main () 
{
    printf("Hello ");
    goto Cleanup;
Cleanup: ; //This is an empty statement.
    char *str = "World\n";
    printf("%s\n", str);
}

答案 1 :(得分:23)

这是C语法的一个怪癖。 标签Cleanup:)不允许出现在声明之前(例如char *str ...;),仅在声明之前< / em>(printf(...);)。在C89中,这并不是一件很难的事,因为声明只能出现在一个块的最开头,所以你总是可以将标签向下移动一点并避免出现问题。在C99中,您可以混合声明和代码,但您仍然无法在声明之前立即放置标签。

你可以在标签的冒号之后立刻加一个分号(如Renan所建议的那样),以便在那里有一个空语句;这就是我在机器生成的代码中所做的。或者,将声明提升到函数的顶部:

int main (void) 
{
    char *str;
    printf("Hello ");
    goto Cleanup;
Cleanup:
    str = "World\n";
    printf("%s\n", str);
    return 0;
}