서론
비주얼 스튜디오에서 typeid를 이용하여 개체의 자료형을 출력하는 방법을 포스팅 했었다.
그런데 비주얼 스튜디오 코드에서는 위와 같은 방법으로 했을때 정수의 출력결과가 'int'가 아니라 'i'였다. 이유를 알아봤다.
본론
사용자가 작성한 소스코드는 기계가 이해할 수 있게 하는 컴파일 과정을 거쳐서 프로그램이 동작하는 런타임과정을 가진다. 그리고 typeid는 컴파일 과정이 아닌 런타임 과정에서 생성한다. 따라서 typeid의 멤버함수인 name()은 런타임에서의 개체 자료형을 리턴한다.
여기서 문제가 발생하는데, C++은 컴파일러가 컴파일하는 과정에서 개체의 이름을 수정할 수 있다. 즉 컴파일러에 따라서 런타임에서의 개체명이 달라질 수 있다.
비주얼 스튜디오와 비주얼 스튜디오 코드의 출력결과가 다른 이유가 여기에 있다. 비주얼 스튜디오는 VS++ 컴파일러를 사용했고 비주얼 스튜디오 코드에는 gcc 컴파일러가 사용되었다.(비주얼 스튜디오 코드는 다양한 컴파일러를 사용할 수 있다.) gcc 컴파일러를 사용한 비주얼 스튜디오 코드는 컴파일 과정에서 int를 i로 바꿔버렸고 그것이 그대로 출력되었다.
따라서 gcc 컴파일러에서 typeid를 사용하는것은 안전하지 않고, 대신에 decltype, typeof를 유사하게 지원한다.
decltype와 typeof는 gcc 컴파일러의 확장기능이므로 VS++에서는 사용할 수 없다.
참고자료
https://stackoverflow.com/questions/1986418/typeid-versus-typeof-in-c
최근댓글