如果我有一个在标签后初始化的variables,为什么我会得到“一个标签只能是一个语句的一部分,一个声明不是一个声明”?

我有以下简化代码:

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

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

我想我知道在切换的情况下阻止的原因,但为什么它应该适用于标签的情况下?

这个错误来自gcc编译器

语言标准根本不允许。 标签只能跟在语句之后,而声明不能作为C中的语句。解决这个问题的最简单的方法是在标签之后插入一个空的语句,这样可以避免跟踪您需要的范围在一个块内。

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

这是C语法的一个怪癖。 一个标签Cleanup:不能在一个声明 (例如char *str ...; )之前立即出现,只能在语句printf(...); )之前出现。 在C89中,这并不是很大的困难,因为声明只能出现在一个块的开头,所以你总是可以将标签向下移动一些,避免这个问题。 在C99中,您可以混合使用声明和代码,但是在声明之前,您仍然不能立即贴上标签。

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

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