![](/img/trans.png)
[英]Why does Clang complain an "initializer element is not a compile-time constant" for a local compound literal?
[英]When I compile my program, why does it complain with "label at end of compound statement"?
當我嘗試編譯我的代碼時,我不斷收到此錯誤消息:
badges.c: In function ‘badgeAnyColor’:
badges.c:335: error: label at end of compound statement
為了幫助您了解抱怨的地方,抱怨位於 switch 語句的最后一行,它說:“case 5:”。 我還有一個問題是我是否正確地執行了 switch 語句的語法(我完全不熟悉將 switch 語句與 if/else 語句一起使用)幫助將不勝感激!
這是我的代碼:
int badgeAnyColor(int x, int y) {
int bronzebadges, northbadges, northeastbadges, northwestbadges, eastbadges,
westbadges, southbadges, southeastbadges, southwestbadges, polybadge;
double fs, ht, fp, sunexp, irrexp;
if ((x >= 1 && x <= 20) && (y >= 1 && y <= 20)) {
fs = fieldScore(x, y);
ht = harvestTime(x, y);
fp = fieldProfit(x, y);
sunexp = sunExposure(x, y);
irrexp = irrigationExposure(x, y);
bronzebadges = countBadges(x, y);
northbadges = countBadges(x, y + 1);
northeastbadges = countBadges(x + 1, y + 1);
northwestbadges = countBadges(x - 1, y + 1);
eastbadges = countBadges(x + 1, y);
westbadges = countBadges(x - 1, y);
southbadges = countBadges(x - 1, y - 1);
southeastbadges = countBadges(x + 1, y - 1);
southwestbadges = countBadges(x - 1, y - 1);
switch (bronzebadges) {
case 0: {
if (x == 1 && y == 1) {
if (northbadges == 0 && northeastbadges == 0 &&
eastbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 1) {
if (northbadges == 0 && northwestbadges == 0 &&
westbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 1 && y == 20) {
if (eastbadges == 0 && southeastbadges == 0 &&
southbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 20) {
if (westbadges == 0 && southwestbadges == 0 &&
southbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if ((x >= 2 && x <= 19) && y == 1) {
if (westbadges == 0 && northwestbadges == 0 && northbadges == 0
&& northeastbadges == 0 && eastbadges == 0) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
return polybadge;
}
case 1: {
if (fs >= 20) {
polybadge = 1;
}
else {
polybadge = 0;
}
return polybadge;
}
case 2: {
if (fp <= 0 || ht < 80 || sunexp > irrexp) {
polybadge = 1;
}
else {
polybadge = 0;
}
return polybadge;
}
case 3: {
if ((x >= 2 && x <= 19) && y == 1) {
if (((westbadges + northbadges) >= 2) || ((northbadges +
eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 1 && y == 1) {
if ((northbadges + eastbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 1) {
if ((northbadges + westbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 1 && y == 20) {
if ((southbadges + eastbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if (x == 20 && y == 20) {
if ((southbadges + westbadges) >= 2) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
if ((x >= 2 && x <= 19) && y == 20) {
if (((westbadges + southbadges) >= 2) || ((southbadges +
eastbadges) >= 2) || ((westbadges + eastbadges) >= 2)) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
else {
if (((northbadges + westbadges) >= 2) || ((westbadges +
southbadges) >= 2) || ((southbadges + eastbadges) >= 2) ||
((northbadges + southbadges) >= 2) || ((westbadges +
eastbadges) >= 2)) {
polybadge = 1;
}
else {
polybadge = 0;
}
}
return polybadge;
}
case 4:
case 5:
}
}
else {
polybadge = -1;
}
return polybadge;
}
錯誤:復合語句末尾的標簽
上面的錯誤是因為這兩種情況
case 4:
case 5:
// here you need to add statement
//if you don't want to do anything simple break statement will work for you
break;
現在你沒有使用這兩種情況你也可以刪除它們。
如果我希望案例 3 中發生的相同事情也發生在案例 4 和 5 中怎么辦? 並感謝您的投入
您需要移動案例 4 和案例 5
case 3:
case 4:
case 5:
//statements you written for case 3
例如
switch(n)
{
case 1:
printf("case 1");
break;
case 2:
printf("case 2");
break;
case 3:
case 4:
case 5:
printf("case 3 or 4 or 5");
break;
default:
printf("Wrong choice");
break;
}
C 中的switch
由一組必須包含語句的 case 標簽組成。 粗略地說,語句是以;
結尾的東西;
. 代碼如
switch (n){
case 4:
case 5:
}
無效,因為沒有要執行的語句。 這就是給你一個編譯錯誤的原因。 一種解決方法是寫
switch (n){
case 4:
case 5:
;
}
哪里;
is 表示一個空語句。 請注意, C
中的開關具有后續功能,這意味着case4
運行到case5
。 這就是為什么在case4
之后不需要空語句的case4
。
更好的是,只需刪除這些案例。
您必須指定案例 5(和案例 4)應該發生什么; 現在什么都沒有,這就是它所抱怨的——你給它貼了一個案例標簽,但沒有告訴它如何處理那個案例。
如果您不想發生任何事情,您可以將機箱放在您的交換機之外。
復合語句末尾的標簽是case 5:
沒有任何東西可以執行。 你需要的是至少break
:
case 4:
case 5:
// do nothing
break;
現在關於語法 - 它似乎是錯誤的。 首先 - 你不需要額外的代碼括號以防萬一。 其次 - 您確實需要在每個塊的末尾break
,除非您想“跌倒”到下一個案例分支。 如果確實需要,請添加一條評論,說明如下:
case 1:
do_something();
break;
case 2:
do_something_else();
/* fall-through */
case 3:
and_something_else_more();
break;
case 42:
if (allow_easter_eggs) // like this
printf("DON'T PANIC\n");
break;
這將執行do_something()
的情況下的1, do_something_else()
和and_something_else_more()
中的2例,只是and_something_else_more()
3。
最后,添加default
標簽總是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.