ラベルはステートメントの一部であり、宣言はステートメントではありません

Namita Chaudhary 2023年10月12日
  1. ラベルはステートメントの一部にしかなれず、宣言はステートメントではありません C のエラー
  2. C で switch ステートメントを使用する場合、ラベルはステートメントの一部であり、宣言はステートメント エラーではありません
  3. ラベルはステートメントの一部にしかできず、宣言はステートメントではありません C のエラーを回避する方法
  4. まとめ
ラベルはステートメントの一部であり、宣言はステートメントではありません

プログラミング言語でプログラミングをしているときに、プログラムの異常な動作を引き起こすエラーに遭遇したり、エラーが解決されるまでプログラムを停止したりします。 この記事では、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 ステートメントを使用して、変数 scase 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 でラベルのブロックを囲む中括弧のペアを使用できます。

関連記事 - C Error