요즘 대학교 전산실 컴퓨터 성능이 기본적으로 멀티코어에 8GB의 램을 깔고 가는 경우가 많다 보니, 통합개발도구(IDE)로 Visual Studio 커뮤니티를 사용하는 경우가 많다. 그 언어 자체의 특성과 프로그래밍에 대해서 다루기 때문에 컴퓨팅 성능이 문제가 되지 않는다면 Visual Studio가 제공하는 여러 환경만큼 입문하는 사람에게 좋은 것은 없다.
이렇게 입문하고서 한창 프로그래밍을 즐기다가 자료구조, 알고리즘 등을 접하고, 좀 더 자신의 실력을 향상시키기 위해서 백준 온라인 저지(BOJ)나, 알고스팟 등의 사이트에서 제공하는 문제를 풀다보면 Visual Studio에서는 정상적으로 작동함에도 불구하고 채점 시 컴파일 에러를 띄우는 문제를 접하게 된다. 예를 들자면, strlen()을 사용하는데 Visual Studio에서는 헤더 파일을 별도로 추가하지 않고도 정상적으로 컴파일이 되지만, GNU GCC에서는 그렇지 않은 경우다.
컴파일러, 표준 등에 관심이 없는 사람이었다면 이 문제를 쉽게 해결하지 못한다. 물론 컴파일 에러가 발생하는 경우 어떤 부분이 문제였는지 알려는 주지만, 사용하고 있는 환경(Visual Studio)에서는 전혀 문제가 없으니 혼란만 유발할 뿐이다. 이 문제는, Visual Studio가 어떤 환경을 제공하고 있었는지 전혀 모르는 사람이라면 대부분 해결하지 못한다.
분명히 Visual Studio에서 본인이 작성한 코드가 잘 돌아가는데 이들 코드가 왜 온라인 채점 사이트에서는 컴파일 에러를 발생시킬까?
문제는 컴파일러의 표준 구현 방식에 있다.
앞서 말했듯, Visual Studio는 다른 개발 도구에 비해서 무겁긴 해도 입문자에게 손쉬운 환경을 제공하며, 자체 컴파일러인 Visual C++ 컴파일러를 사용한다. Visual Studio에서 문제가 없었다는 말은 Visual Studio라는 환경에서 정상적으로 컴파일 되었다는 이야기지, 이것이 GNU GCC 같은 다른 컴파일러를 사용하는 IDE 환경에서 문제가 없음을 보장하는 것은 아니라는 이야기다.
개인적으로 알고리즘 문제 풀이를 시작한 초기에 이 문제를 많이 접해본 필자의 입장에서는 아래 절차를 따르면 어지간해서는 문제를 일으키지 않는다.
1. 표준을 확인하라.
표준은 어느 환경에서든 동일한 결과를 보장해준다. 표준을 따르면 VS C++이나 GNU GCC나 동일한 결과를 받아볼 수 있다는 이야기다. 말처럼 쉬운 이야기가 아니다. 입문자에게 ANSI 표준을 알아보라는 것은 조금 가혹한 이야기로 들린다. 어떤 것이 표준이고 어떤 것이 표준이 아닌지 IDE에서 제공해주는 것도 아니고, 심지어 IDE가 표준이 아닌 것도 지원하면 해당 IDE만 사용하는 사람들은 그것이 표준인 것으로 착각하기 때문이다.
2. 헤더를 알아봐라.
필자는 이 방식을 주로 사용하는데, 1번 방법을 따르는 것도 결과적으로 이 방법을 사용하면 가능하다. 거의 대부분의 문제가 여기서 해결되기 때문이다. 표준 문서를 뒤지는 것보다 자신이 사용할 함수가 어느 헤더파일에 정의되어 있는지 알려주는 사이트에서 검색을 해서 그 헤더만 사용하면 어떤 환경에서도 정상적으로 컴파일할 수 있음을 보장받을 수 있기 때문이다. 개인적으로는 아래 두 사이트를 이용한다.
cplusplus.com : http://www.cplusplus.com/
cppreference : http://ko.cppreference.com/w/
3. 특정 IDE에서만 되는 함수?
필자도 Visual C++ 6.0을 통해서 코딩 세계에 잠깐 입문했다가, 약 6년 간의 공백기 후에 다시 코딩을 시작했을 때 접했던 문제였다. Visual Studio 2013 Community로 다시 코딩 세계로 돌아왔을 때 과거의 기억을 되살리며 scanf를 사용했더니 C4996 에러를 띄우며 정상적으로 컴파일이 되지 않았다. 여러 보안 상의 이유로 scanf_s 사용을 권하는 것인데 이 문제는 gets 등의 함수를 사용할 때도 발생했다. 이럴 땐 선택을 해야 한다.
- #pragma 문을 이용해서 해당 에러를 무시
- Visual Studio에서만 해당 함수를 사용 & 다른 IDE에서 컴파일
이런 문제는 표준이 아니라서 발생할 수도 있지만, 표준임에도 발생할 수 있다. 위에서 말한 scanf_s 같은 경우는 C11 표준이다.
'Programming Language > C,C++' 카테고리의 다른 글
C, C++] 조건부 컴파일 (0) | 2018.05.08 |
---|---|
C, C++] 매크로 정의, 해제 (0) | 2018.05.06 |
C++] 공백을 포함하는 문자열 여러 줄 입력 받기 (0) | 2018.02.12 |
C, C++] 메모리 영역(Code, Data, Stack, Heap) (0) | 2018.02.11 |
C,C++] malloc과 new의 차이점 (0) | 2018.02.10 |