參考資料:
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; }