ラベルはステートメントの一部であり、宣言はステートメントではありません
- ラベルはステートメントの一部にしかなれず、宣言はステートメントではありません C のエラー
-
C で
switch
ステートメントを使用する場合、ラベルはステートメントの一部であり、宣言はステートメント エラーではありません - ラベルはステートメントの一部にしかできず、宣言はステートメントではありません C のエラーを回避する方法
- まとめ
プログラミング言語でプログラミングをしているときに、プログラムの異常な動作を引き起こすエラーに遭遇したり、エラーが解決されるまでプログラムを停止したりします。 この記事では、C 言語でのみ発生するラベルはステートメントの一部にすぎず、宣言はステートメントではありません
というエラーについて説明します。
ラベルはステートメントの一部にしかなれず、宣言はステートメントではありません C のエラー
エラーは、プログラムの異常な動作につながる、プログラマーによって行われた予期しない状況または違法なアクションです。 これらのエラーには、その影響に基づいてさまざまなタイプがあります。
ただし、一部のエラーはすべてのプログラミング言語で一般的ではなく、特定の言語でのみ発生します。 そのようなエラーの 1つは、C 言語でのみ発生するラベルはステートメントの一部にすぎず、宣言はステートメントではありません
です。
このエラーは、宣言がラベルの直後に続く場合に発生します。 ただし、C 言語標準では、宣言ではなく、ラベルに続くステートメントのみが許可されています。
C 言語のラベルは、ソース コード内の特定の場所を参照する一連の文字です。 ラベルは、プログラムの goto
ステートメントで使用されます。
以下のコードのように使用されます。
#include <stdio.h>
int main() {
goto TARGET;
TARGET:
printf("Hello World");
return 0;
}
出力:
Hello World
goto
ステートメントに達すると、プログラム制御はプログラム内の指定されたラベルにジャンプします。 上記のプログラムでわかるように、ラベル TARGET
の後に printf
ステートメントが続くため、出力は正常に印刷されます。
ただし、ラベルの後に変数を宣言しようとすると、C 言語標準ではラベルの直後の宣言が許可されていないため、同じコードでエラーが発生します。 そのため、プログラムはラベルはステートメントの一部にすぎず、宣言はステートメントではありません
というエラーをスローします。
このようなエラーをスローする例を見てみましょう:
#include <stdio.h>
int main() {
goto TARGET;
TARGET:
char* s = "Hello World";
printf("%s", s);
return 0;
}
出力:
.ex1.c: In function 'main':
.ex1.c:7:5: error: a label can only be part of a statement and a declaration is not a statement
char * s = "Hello World";
^
出力に示されているように、ラベルはステートメントの一部のみであり、宣言はステートメントではありません
というエラーが表示されます。 また、ラベルTARGET
の後の宣言文である特定の問題行も示されています。
ただし、宣言がラベルの直後に続いていなければ、プログラムは正常に機能していたはずです。 その例も見てみましょう。
#include <stdio.h>
int main() {
goto TARGET;
TARGET:
printf("%d", 2 + 5);
char* s = "Hello World";
printf("%s", s);
return 0;
}
出力:
7Hello World
したがって、ラベルはステートメントの一部であることができ、宣言はステートメントではありません
というエラーは、宣言がプログラム内のラベルの直後にある場合にのみ発生します。 ラベルと宣言の後に printf
ステートメントを追加しても、エラーは発生しませんでした。
C で switch
ステートメントを使用する場合、ラベルはステートメントの一部であり、宣言はステートメント エラーではありません
ラベルはステートメントの一部にしかなれず、宣言はステートメントではない
というエラーは、C で switch
ステートメントを使用しているときにも発生します。これは、C 言語がラベルと同様にケースを扱うためです。
そのため、case の直後に何かを宣言しようとすると、ラベルはステートメントの一部にすぎず、宣言はステートメントではありません
というエラーがユーザーにスローされます。
同じ例を見てみましょう。
#include <stdio.h>
int main() {
char ch = 'A';
switch (ch) {
case 'A':
char* s = "Case A";
printf("%s", s);
break;
}
}
出力:
.ex1.c: In function 'main':
.ex1.c:8:7: error: a label can only be part of a statement and a declaration is not a statement
char * s = "Case A";
^
したがって、上記の出力からわかるように、C で switch ステートメントを使用して、変数 s
を case A
の直後に宣言しようとすると、同じエラーがスローされます。
ラベルはステートメントの一部にしかできず、宣言はステートメントではありません C のエラーを回避する方法
ここで、このエラーラベルはステートメントの一部にすぎず、宣言はステートメントではありません
を解決する方法について説明します。
ラベルの後にセミコロンを置くだけで、このエラーを回避できます。 コンパイラはセミコロンを空白のステートメントとして扱い、エラーをスローしません。
例を使って上記の解決策を見てみましょう。
#include <stdio.h>
int main() {
goto TARGET;
TARGET:;
char* s = "Hello World";
printf("%s", s);
return 0;
}
出力:
Hello World
上記のコードで、ラベル TARGET
の後にセミコロンを追加することで、ラベルの直後に変数 s
を宣言できることがわかります。 ラベルはステートメントの一部にすぎず、宣言はステートメントではありません
というエラーはスローされません。
前に説明したように、cases
は C 言語のラベルに似ていると見なされるため、switch
ステートメントの処理中にも同じエラーが発生します。
したがって、switch
ステートメントのエラーを解決するには、case
の後にセミコロンを追加するか、switch
ステートメントの case
のブロックを中括弧で囲みます。 どちらの方法でもエラーを解決できます。
case
の後にセミコロンがあるコードを見てみましょう:
#include <stdio.h>
int main() {
char ch = 'A';
switch (ch) {
case 'A':;
char* s = "Case A";
printf("%s", s);
break;
}
}
出力:
Case A
したがって、ご覧のとおり、セミコロンを追加するだけで、ラベルはステートメントの一部であることができ、宣言はステートメントではありません
というエラーが解決されます。
ここで、ラベルのブロックを囲む中括弧のペアを追加して、エラーを解決しましょう。
#include <stdio.h>
int main() {
char ch = 'A';
switch (ch) {
case 'A': {
char* s = "Case A";
printf("%s", s);
break;
}
}
}
出力:
Case A
case A
のステートメントを囲む中括弧のペアを追加することで、エラーを解決しました。
まとめ
この記事では、ラベルはステートメントの一部にすぎず、宣言はステートメントではありません
というエラーについて詳しく説明しました。 C 言語標準では、ラベルの後のステートメントのみが許可され、エラーがスローされる原因となるラベルの直後の宣言は許可されません。
エラーを解決するには、ラベルの後にセミコロンを使用し、C の switch
ステートメントの case
でラベルのブロックを囲む中括弧のペアを使用できます。