레이블은 진술의 일부만 될 수 있으며 선언은 진술이 아닙니다.

Namita Chaudhary 2023년10월12일
  1. 레이블은 명령문의 일부만 될 수 있고 선언은 명령문이 아님 C의 오류
  2. C에서 switch 문을 사용할 때 레이블은 문의 일부만 될 수 있으며 선언은 문 오류가 아닙니다.
  3. a 레이블을 피하는 방법은 명령문의 일부만 될 수 있으며 C에서 선언은 명령문 오류가 아닙니다.
  4. 결론
레이블은 진술의 일부만 될 수 있으며 선언은 진술이 아닙니다.

프로그래밍 언어로 프로그래밍하는 동안 오류가 발생하여 프로그램이 비정상적으로 작동하거나 오류가 해결될 때까지 프로그램이 중단됩니다. 이 기사에서는 C 언어에서만 발생하는 레이블은 명령문의 일부일 수 있고 선언은 명령문이 아닙니다라는 오류에 대해 설명합니다.

레이블은 명령문의 일부만 될 수 있고 선언은 명령문이 아님 C의 오류

오류는 프로그램의 비정상적 작동을 초래하는 프로그래머에 의한 예상치 못한 상황이나 불법적인 행동입니다. 이러한 오류는 그 영향에 따라 다양한 유형이 있습니다.

그러나 일부 오류는 모든 프로그래밍 언어에서 공통적이지 않고 특정 언어에서만 발생합니다. 이러한 오류 중 하나는 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 언어에서 케이스를 레이블과 유사하게 취급하기 때문입니다.

따라서 사례 직후에 무언가를 선언하려고 할 때마다 레이블은 명령문의 일부일 수 있으며 선언은 명령문이 아닙니다라는 오류가 사용자에게 발생합니다.

동일한 예를 살펴보겠습니다.

#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";
       ^

따라서 위 출력에서 볼 수 있듯이 case A 바로 뒤에 변수 s를 선언하려고 할 때 C에서 switch 문을 사용할 때 동일한 오류가 발생했습니다.

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