Kri*_*dra 66 c goto variable-declaration
今天我发现了一件有趣的事情.我不知道在goto标签之后无法声明变量.
编译以下代码
#include <stdio.h>
int main() {
    int x = 5;
    goto JUMP;
    printf("x is : %d\n",x);
JUMP:
    int a = 0;  <=== giving me all sorts of error..
    printf("%d",a);
}
给出错误
temp.c: In function ‘main’:
temp.c:7: error: expected expression before ‘int’
temp.c:8: error: ‘a’ undeclared (first use in this function)
temp.c:8: error: (Each undeclared identifier is reported only once
temp.c:8: error: for each function it appears in.)
那背后的逻辑是什么?我听说无法在switch的case语句中创建变量.由于JUMP是goto语句的同一范围(主要功能的范围,在我的情况)里面,我相信,范围是不是一个问题在这里.但是,为什么我会收到此错误?
Ste*_*non 84
语法根本不允许它.§6.8.1标签声明:
labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement
请注意,没有允许"标记声明"的子句.它不是语言的一部分.
当然,你可以通过一个空的陈述来解决这个问题.
JUMP:;
int a = 0;
Bas*_*tch 14
你想在标签后面有一个分号,如下所示:
 #include <stdio.h>
 int main() {
     int x = 5;
     goto JUMP;
     printf("x is : %d\n",x);
 JUMP: ;     /// semicolon for empty statement
     int a = 0; 
     printf("%d",a);
 }    
然后你的代码正确编译为C99标准,gcc -Wall -std=c99 -c krishna.c(我在Debian/Sid/AMD64上使用GCC 4.6).
我的gcc版本(4.4)给出了这个编译错误:
t.c:7: error: a label can only be part of a statement and a declaration is not a statement
.此错误消息说明了一切.
如果您知道为什么不能在 switch 的 case 语句内创建变量,基本上这与您不能这样做的原因相同。作为修复,你可以尝试这个,
#include <stdio.h>
int main() {
    int x = 5;
    goto JUMP;
    printf("x is : %d\n",x);
JUMP:
    {                                              //Note this
       int a = 0;  // <=== no more error..
       printf("%d",a);
    }                                             //Note this
}
| 归档时间: | 
 | 
| 查看次数: | 27174 次 | 
| 最近记录: |