UFO ET IT

Goto Label 이후의 변수 선언

ufoet 2020. 11. 14. 11:23
반응형

Goto Label 이후의 변수 선언


오늘 저는 흥미로운 것을 발견했습니다. goto 레이블 뒤에 변수를 선언 할 수 없다는 것을 몰랐습니다.

다음 코드 컴파일

#include <stdio.h>
int main() {
    int x = 5;
    goto JUMP;
    printf("x is : %d\n",x);
JUMP:
    int a = 0;  <=== giving me all sorts of error..
    printf("%d",a);
}

다음과 같은 오류를 제공합니다.

temp.c: In function ‘main’:
temp.c:7: error: expected expression before ‘int’
temp.c:8: error: ‘a’ undeclared (first use in this function)
temp.c:8: error: (Each undeclared identifier is reported only once
temp.c:8: error: for each function it appears in.)

이제 그 논리는 무엇입니까? switch의 case 문 안에 변수를 만들 수 없다고 들었습니다 . JUMP는 goto 문과 동일한 범위 (내 경우에는 주요 기능의 범위) 내에 있으므로 범위가 여기서 문제가되지 않는다고 생각합니다. 그런데 왜이 오류가 발생합니까?


구문은 단순히 그것을 허용하지 않습니다. §6.8.1 레이블이있는 진술 :

labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement

"레이블이있는 선언"을 허용하는 절이 없습니다. 그것은 언어의 일부가 아닙니다.

물론 빈 문장으로이 문제를 간단하게 해결할 수 있습니다.

JUMP:;
int a = 0;

다음과 같이 레이블 뒤에 세미콜론이 필요합니다.

 #include <stdio.h>
 int main() {
     int x = 5;
     goto JUMP;
     printf("x is : %d\n",x);
 JUMP: ;     /// semicolon for empty statement
     int a = 0; 
     printf("%d",a);
 }    

그런 다음 코드가 C99 표준에 맞게 올바르게 컴파일됩니다 gcc -Wall -std=c99 -c krishna.c(Debian / Sid / AMD64에서 GCC 4.6을 사용하고 있습니다).


내 gcc 버전 (4.4)에서이 컴파일 오류가 발생합니다.

t.c:7: error: a label can only be part of a statement and a declaration is not a statement

. 이 오류 메시지는 모든 것을 알려줍니다.


사양이 아닌 간단한 설명은 컴파일러가 goto 이후의 코드를 실행으로 컴파일 한 다음 오프셋을 계산할 수있는 코드로 제외하고 변수 선언이 명령문이 아니기 때문에 시작된다는 것입니다. / 블록을 이러한 오프셋으로 컴파일 할 수 있습니다.


글쎄, 먼저 일관성이 있어야합니다. 그것은 하나의 LABELlabel. 둘째, 레이블은 진술의 일부이며 선언이 설명에 충분히 대답하지 않습니다.

당신은 대체 할 수 LABEL:와 함께 label: ;한 후 컴파일 할 확률이있다.

EDIT: Now that you edited your code all over, it should be JUMP: replaced with JUMP: ; ;-)


If you know why you can't create variables inside case statement of switch, basically its the same reason why you cant do this too. As a fix, you can try this,

#include <stdio.h>
int main() {
    int x = 5;
    goto JUMP;
    printf("x is : %d\n",x);
JUMP:
    {                                              //Note this
       int a = 0;  // <=== no more error..
       printf("%d",a);
    }                                             //Note this
}

It's not because of the label per se, it's because there are already statements (goto and printf). The latest standard seems to allow variable declarations in arbitrary places, but not every compiler fully conforms to the standard. Also, identifiers are case-sensitive in C and your label must be the same in both places.


#include <stdio.h>
int main() {
    int x = 5;
    goto JUMP;
    printf("x is : %d\n",x);
JUMP:
    printf("Do anything after label but dont declare 
    anything. even empty statement will also work 
    because label can only be part of a statement");
    int a = 0;  
    printf("%d",a);
}

참고URL : https://stackoverflow.com/questions/8384388/variable-declaration-after-goto-label

반응형