我有以下简化代码:
#include <stdio.h>
int main ()
{
printf("Hello ");
goto Cleanup;
Cleanup:
char *str = "World\n";
printf("%s\n", str);
}
我收到错误,因为在标签后面声明了一个新变量。如果我将标签后的内容(主要是初始化)放在{}块中,则编译成功。
我认为我理解在切换时阻塞的原因,但为什么它应该适用于标签?
此错误来自gcc编译器
答案 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;
}