ラベルの後に初期化される変数がある場合、「ラベルはステートメントの一部にしかならず、宣言はステートメントではありません」というメッセージが表示されるのはなぜですか? [重複] 質問する

ラベルの後に初期化される変数がある場合、「ラベルはステートメントの一部にしかならず、宣言はステートメントではありません」というメッセージが表示されるのはなぜですか? [重複] 質問する

次のような簡略化されたコードがあります。

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

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

スイッチの場合にブロックする理由は理解していると思いますが、ラベルの場合にそれが適用されるのはなぜでしょうか?

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

ベストアンサー1

言語標準では、これを許可していません。ラベルの後にはステートメントのみが続き、C では宣言はステートメントとしてカウントされません。これを回避する最も簡単な方法は、ラベルの後に空のステートメントを挿入することです。これにより、ブロック内で必要なようにスコープを追跡する必要がなくなります。

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

おすすめ記事