1. ホーム
  2. c

[解決済み] ラベルの後に初期化される変数がある場合、「ラベルは文の一部でしかなく、宣言は文ではありません」となるのはなぜですか?[重複しています]。

2022-02-01 17:05:38

質問

私は以下のような簡略化されたコードを持っています。

#include <stdio.h>
int main () 
{
    printf("Hello ");
    goto Cleanup;
Cleanup:
    char *str = "World\n";
    printf("%s\n", str);
}

ラベルの後に新しい変数が宣言されているため、エラーが発生します。ラベルの後に内容(主に初期化)を{}ブロックに入れると、コンパイルが成功します。

switchの場合はブロックが必要なのはわかる気がしますが、labelの場合はなぜなのでしょうか?

このエラーは、gccコンパイラのものです

解決方法は?

言語規格がそれを許さないだけです。これを回避する最も簡単な方法は、ラベルの後に空のステートメントを挿入し、ブロック内で必要なスコープを追跡することから解放されることです。

#include <stdio.h>
int main () 
{
    printf("Hello ");
    goto Cleanup;
Cleanup: ; //This is an empty statement.
    char *str = "World\n";
    printf("%s\n", str);
}