a label can only be part of statement and a declaratioin is not a statement

参考资料:

  https://stackoverflow.com/questions/18496282/why-do-i-get-a-label-can-only-be-part-of-a-statement-and-a-declaration-is-not-a

问题背景:

  写了一段code,如下:

#include<stdio.h>

int main()
{
    int a;switch (a) {
        case 0:
            break;
        case 1:
            int aa;
            break;
        case 2:
            break;
        default:
            break;
    }

    return 0;
}

  如上所示code编译时候会报错,错误提示“a label can only be part of statement and a declaratioin is not a statement”。

问题原因:

  引用一段话解释为“Prior to C99, all declarations had to precede all statements within a block, so it wouldn't have made sense to have a label on a declaration. C99 relaxed that restriction, permitting declarations and statement to be mixed within a block, but the syntax of a labeled-statement was not changed. – Keith Thompson”。

  翻译过来就是,C99之前,在一代码块中所有的定义都必须在声明之前,所以,一个标签在定义之前是没有意义的。C99放宽了这个限制,允许代码块中混合定义、声明,但这这个标签不能在定义之前的限制没有改变。

解决方法:

#include<stdio.h>

int main()
{
    int a;
switch (a) { case 0: break; case 1:; //加一个空的‘;’,标示空声明 int aa; break; case 2: break; default: break; } return 0; }

 

#include<stdio.h>

int main()
{
    int a;
    int aa;    //定义放到 switch 之前
    switch (a) {
        case 0:
            break;
        case 1:
            break;
        case 2:
            break;
        default:
            break;
    }

    return 0;
}

 

posted on 2019-06-05 14:34  rivsidn  阅读(3203)  评论(0编辑  收藏  举报

导航