如果我有一个在标签后初始化的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; }