1. ホーム
  2. c

goto の後の変数宣言 Label

2023-10-12 18:55:49

質問

今日、一つ面白いことを発見しました。私は、gotoラベルの後に変数を宣言することができないことを知りませんでした。

以下のコードをコンパイルすると

#include <stdio.h>
int main() {
    int x = 5;
    goto JUMP;
    printf("x is : %d\n",x);
JUMP:
    int a = 0;  <=== giving me all sorts of error..
    printf("%d",a);
}

は以下のようなエラーを出します。

temp.c: In function ‘main’:
temp.c:7: error: expected expression before ‘int’
temp.c:8: error: ‘a’ undeclared (first use in this function)
temp.c:8: error: (Each undeclared identifier is reported only once
temp.c:8: error: for each function it appears in.)

さて、それはどういう理屈なのでしょうか?私は、次のように聞きました。 switchのcase文の中では変数を作れない。 . JUMPはgoto文と同じスコープ(私の場合はmain関数のスコープ)内にあるので、ここではスコープは問題ないと思います。しかし、それならなぜこのエラーが出るのでしょうか?

どのように解決するのですか?

構文がそれを許さないだけです。 §6.8.1 ラベル付きステートメント。

labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement

なお、"ラベル付き宣言"を許可する句はありません。 それは言語の一部ではないだけです。

もちろん、空のステートメントで、これを回避することは可能です。

JUMP:;
int a = 0;