switch情况下出错,标签只能是语句的一部分,声明不是语句

q0qdq0h2  于 2023-10-15  发布在  其他
关注(0)|答案(1)|浏览(160)

我创建一个简单的菜单与开关的情况下,所以根据写的值,它可以做不同的事情,

void
menu_principal()
{
    int opciones;

    printf ("Ingrese su eleccion \n");

    scanf("%d", &opciones);

    switch(opciones) 
    {
        case 1: 
            
            int coord_x;
            int coord_y;
            
            printf("Ingrese las cordenadas de x \n: ");
            scanf( "%d", &coord_x);
            
            printf("Ingrese las cordenadas de y \n");
            scanf( "%d", &coord_y );
            
            break;
        
        
        case 0:        
            
            break;
        
        …
          
    }
    return 0;

}

但它就是不工作,我得到的错误与scanfint coord_xcoord_y

ia2d9nvy

ia2d9nvy1#

C23之前

在C23之前,你不能在像int coord_x;这样的声明之前放一个标签。
你可以标记一个块-在int coord_x;之前添加{,在break;之前添加}(在它也可以工作之后)。
C11 §6.8.1带标签的语句表明标签后面必须有语句。§6.8声明显示了什么构成声明; §6.8.2复合语句表明声明与语句不同,6.7声明涵盖了声明的组成部分。
标签必须位于语句之前,但它可以是空语句--在;上只是一个空值。这意味着你不能在复合语句的右括号之前直接放置标签;你必须在它后面加上一个引号,才能成为带标签的语句。

C23及更高版本

C23解除了不能标记变量声明的约束。(新)附件M.2中的摘要指出:

  • 允许在声明前面和复合语句末尾放置标签;

它通过细化语法来实现这一点:

  • (6.8.1)标签声明:标签声明
  • (6.8.2)化合物声明:{ block-item-listopt }
  • (6.8.2)块项目列表:块项|块项列表
  • (6.8.2)块项目:宣言|无标号语句|标签

语义部分说:
复合语句中的任何语句或声明前面都可以有一个前缀,该前缀将标识符声明为标签名称。可选的属性说明符序列与标签相关。标签本身不会改变控制流,控制流在标签之间畅通无阻地继续。
因此,在C23中,标签可以出现在声明之前,或者直接出现在复合语句的右括号之前。
“optional attribute specifier”主要是[[maybe_unused]],这表明它所附加的标签可能不会被使用。建议编译器不要就使用或不使用该属性标记的标签给出给予警告。

相关问题