次のような簡略化されたコードがあります。
#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);
}