4

编译以下代码时出现编译错误。

#include <stdio.h>
main()
{
    printf("Hello 123\n");
    goto lab;
    printf("Bye\n");

lab: int a = 10;
     printf("%d\n",a);
}

当我编译这段代码时,它给出了

test.c:8: error: a label can only be part of a statement and a declaration is not a statement

为什么标签的第一部分应该是声明而不是声明?

4

3 回答 3

6

因为这个特性被称为标签语句

C11 §6.8.1 标记语句

句法

labeled-statement:

identifier : statement

case constant-expression : statement

default : statement

一个简单的解决方法是使用空语句(单个分号;

#include <stdio.h>
int main()
{
    printf("Hello 123\n");
    goto lab;
    printf("Bye\n");

lab: ;         //null statement
    int a = 10;
    printf("%d\n",a);
}
于 2013-11-07T06:44:03.213 回答
5

在 c 根据规范

§6.8.1 标记语句:

labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement

在 c 中没有允许“标记声明”的子句。这样做,它将起作用:

#include <stdio.h>
int main()
{
    printf("Hello 123\n");
    goto lab;
    printf("Bye\n");

lab: 
    {//-------------------------------
        int a = 10;//                 | Scope
        printf("%d\n",a);//           |Unknown - adding a semi colon after the label will have a similar effect
    }//-------------------------------
}

标签使编译器将标签解释为直接跳转到标签。在这种代码中,您也会遇到类似的问题:

switch (i)
{   
   case 1:  
       // This will NOT work as well
       int a = 10;  
       break;
   case 2:  
       break;
}

再次只需添加一个范围块 ( { }) 就可以了:

switch (i)
{   
   case 1:  
   // This will work 
   {//-------------------------------
       int a = 10;//                 | Scoping
       break;//                      | Solves the issue here as well
   }//-------------------------------
   case 2:  
       break;
}
于 2013-11-07T06:43:02.723 回答
0

一个简单(但丑陋)的解决方案:

lab: ; 
int a = 10;

空语句使一切正常。不需要
换行符和之前的空格。;

于 2013-11-07T10:21:52.350 回答