분류대기

[리눅스] goto 사용 시 컴파일

jdaemanv2 2025. 1. 14. 22:01

[1. 개요]

c++ 코드 작성 시, goto 문이 필요한 경우

  • 동일한 코드라도 컴파일러 종류에 따라서 컴파일이 될  수도 있고 안될 수 있다.
  • 윈도우 msvc 컴파일러는 허용 폭이 관대한 편이고,
  • 리눅스 g++ 컴파일러는 굉장히 타이트 한 편인 것 같다.

[2. 예제]

아래 코드는 리눅스에서 컴파일이 안된다.

#include <iostream>

int main(int argc, char **argv)
{
        if (argc == 1) {
                goto EXIT;
        }

        int a=3;
        int b=4;

        std::cout << a << " " << b << std::endl;

EXIT:
        return 0;
}

 

  • error: jump to label ‘EXIT' 이라는 에러가 발생.
  • 원인은 변수의 선언이 goto 문과 와 goto 할 label 사이에 있기 때문이다.
  • c 코드는 변수를 항상 지역의 제일 첫번째에 와야 하지만,
  • c++ 코드는 이러한 규칙을 지킬 필요가 없다.
  • 따라서 아래와 같이 goto ~ label 사이의 변수 선언을 하지 않으면 컴파일이 된다.
#include <iostream>

int main(int argc, char **argv)
{
        int a=3;
        int b=4;

        if (argc == 1) {
                goto EXIT;
        }


        std::cout << a << " " << b << std::endl;

EXIT:
        return 0;
}