ラベルの置き場所によってエラーが出る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
h1j1k1
記事: 37
登録日時: 6年前

ラベルの置き場所によってエラーが出る

#1

投稿記事 by h1j1k1 » 6年前


gotoのラベルの置く場所によってエラーが出るか出ないかが変わります。
なぜでしょうか?
OS:win7, compiler:mingw-w64

コード抜粋

コード:

goto lbl;
switch(s){
	case 1:{
	lbl:
	printf(label);
	break;
}
	
error: a label can only be part of a statement and a declaration is not a statement

コード:

goto lbl;
switch(s){
	case 1:{
	printf("label");
	lbl:
	printf("label");
	break;
}

コンパイル成功

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ラベルの置き場所によってエラーが出る

#2

投稿記事 by みけCAT » 6年前

そのままでは明らかにコンパイルできないので適当にコードを補ったところ、
どちらのコードもWandbox (C / gcc 8.1.0) でコンパイルが通りました。
そのままコンパイラに入力して問題が再現できるコードを提示していただけますか?

コード:

#include <stdio.h>

int main(void) {
	const char* label = "";
	int s = 0;

	goto lbl;
	switch(s){
		case 1:{
		lbl:
		printf(label);
		break;
	}

	}
	return 0;
}

コード:

#include <stdio.h>

int main(void) {
	int s = 0;

	goto lbl;
	switch(s){
		case 1:{
		printf("label");
		lbl:
		printf("label");
		break;
	}

	}
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

h1j1k1
記事: 37
登録日時: 6年前

Re: ラベルの置き場所によってエラーが出る

#3

投稿記事 by h1j1k1 » 6年前


抜粋するところを間違えていました。
すいません。
コート全体を送らせていただきます。

エラーコード

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define GetRand (((unsigned int)((float)rand() / 32768.0)) * 10)

int main(void) {
	const char* label = "print\n";
	srand((unsigned int)time(NULL));
	int s = GetRand;
	if(s == 3) goto lbl;
	while(0){
		switch(s){
			case 1:{
				lbl:
				int ed = s * GetRand;
				printf("end(%d, %d)", s, ed);
				goto end;
				break;
			}
			case 0:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:{
				printf(label);
				printf(" = %d\n", label);
			}
			default:{
				printf("error");
				exit(1);
				break;
			}
		}
		s = GetRand;
	}
	end:
	return 0;
}



エラー無しコード

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define GetRand (((unsigned int)((float)rand() / 32768.0)) * 10)

int main(void) {
	const char* label = "print\n";
	srand((unsigned int)time(NULL));
	int s = GetRand;
	if(s == 3) goto lbl;
	while(0){
		switch(s){
			case 1:{
				lbl:
				printf(""); // これ追記しただけです
				int ed = s * GetRand;
				printf("end(%d, %d)", s, ed);
				goto end;
				break;
			}
			case 0:
			case 2:
			case 3:
			case 4:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:{
				printf(label);
				printf(" = %d\n", label);
			}
			default:{
				printf("error");
				exit(1);
				break;
			}
		}
		s = GetRand;
	}
	end:
	return 0;
}


暇つぶしに書いたものなので、コードの意味や効率は突っ込まないで頂けるとありがたいです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ラベルの置き場所によってエラーが出る

#4

投稿記事 by みけCAT » 6年前

エラーメッセージの通り、ラベルの対象が宣言か普通の文かの違いでしょう。

コード:

			case 1:{
				int ed;
				lbl:
				ed = s * GetRand;
				printf("end(%d, %d)", s, ed);
				goto end;
				break;
			}
とするとエラーが出なくなると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
あたっしゅ
記事: 664
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: ラベルの置き場所によってエラーが出る

#5

投稿記事 by あたっしゅ » 6年前

「構造化プログラミング」の立場から言えば、(C++ の規格に反しなくても)外から switch 文の中に goto 文で突っ込んでいくのがおかしい。
ん、case n: 節から case m: 節に飛ぶのは、ありか ?
goto で return まで飛ぶぐらいなら、その場で、return すりゃ、いいんじゃないの ?
goto 文で美しいと思ったのは、ステイトマシンの記述。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

h1j1k1
記事: 37
登録日時: 6年前

Re: ラベルの置き場所によってエラーが出る

#6

投稿記事 by h1j1k1 » 5年前

gotoでswitch文で入るのはやめた方がいいんですね。勉強になりました
case n節からm節に飛ぶのはアウトなんですか?私は普通に使ってました
gotoでreturnに特に意味はないですね。そのままreturnするようにします

返信

“C言語何でも質問掲示板” へ戻る