__purecall이 무엇일까? :: 2007/10/03 21:03


R6025를 새롭게 소개해 드린 이유는 __purecall에 대해서 설명하기 위해서 였습니다. 그 녀석과 __purecall이 매우 밀접한 관계에 있거든요. 아래 코드를 봅시다. R6025 예제보다 더 작위적이죠. 아직 생성되지 않은 가상 함수를 호출하기 위해서 func란 함수를 이용합니다. Entry를 main으로 고치고 컴파일해서 실행해 보면 R6025 에러가 날 겁니다. 하지만 이번에는 조금 다르게 해봅니다. 아래 코드를 Visual C++의 콘솔 프로젝트에 타이핑해 넣고 CRT를 연결하지 않고, 진입점을 Entry로 설정해두고 컴파일 해 봅니다. 아마도 에러가 날 겁니다. __purecall을 찾을 수 없다는 에러죠.

CRT를 연결하지 않는 방법은 간단합니다. 여러분이 지정한 CRT 라이브러리를 링크시에 무시하도록 만들면 됩니다. 만약 멀티 스레드 CRT를 선택했다면 프로젝트 속성 창에서 링크 필드에 있는 무시 라이브러리 목록에 libcmt.lib를 추가해 주면 됩니다.


에러를 없애기 위해서는 아래와 같이 _purecall을 만들어서 넣어주면 됩니다. __purecall이 없다는데 _purecall을 만드는 이유는 Visual C++ 컴파일러가 함수 명 앞에 언더바를 붙이기 때문입니다. 이 녀석을 추가한 다음 컴파일을 하면 정상적으로 컴파일이 될 겁니다. 실행하면 purecall이란 메시지가 출력 될 겁니다.


아마 이쯤되면 여러분 모두가 눈치를 챘을 겁니다. 맞습니다. 순수 가상 함수는 이론적으로는 존재하지 않는 함수 입니다. 하지만 실질적으로 컴파일러는 그 부분을 __purecall로 채웁니다. 즉, 가상 함수를 저장하는 vtable의 함수 부분을 __purecall로 대체한다는 것이죠. 그렇게 함으로써 런타임에 에러를 출력해 줄 수 있죠. 만약 그 부분을 채우지 않고 NULL로 두었다면 잘못된 연산을 수행했다는 메시지와 함께 종료될 것 입니다.

스폰서
글타래

  • 2주간 인기 글
  • 2주간 인기글이 없습니다.
Trackback Address :: http://jiniya.net/tt/trackback/597
  • Gravatar Image.
    정성태 | 2007/10/04 08:43 | PERMALINK | EDIT/DEL | REPLY

    오... ^^ 재미있는 글이군요. 제목만 봤을 때는, VC++ 9 버전에서 새롭게 소개되는 calling convention 인가 싶었다는. ^^;

    vtable 요소의 기본값이 null 이 아니라는 생각은 해본적이 없었습니다. 근데, Microsoft 도 좀 무심하군요. 기본 _purecall 메서드가 출력해주는 메시지가 달랑 R6025 메시지라늬. 좀 더 자세하게(문맥에 따른 정보까지는 아니더라도, 당황스럽지 않을 정도의) 메시지를 출력해 줘도 좋았을 텐뎅. ^^

    • Gravatar Image.
      codewiz | 2007/10/04 11:26 | PERMALINK | EDIT/DEL

      생각못했는데 제목만 보면 그럴수 있을 것 같습니다. 전형적인 콜링 컨벤션 이름이네요.

      메시지를 좀 더 자세히 출력해주면 덜 당황할텐데 말이죠. 저도 처음 저 메시지를 봤을때는 뭔가 했습니다. 특히나 GUI 프로그램에서는 ASSERT 경고창으로 뜨는데 릴리즈버전에서 ASSERT 경고가 뜨길래 더 놀랬죠.

  • Gravatar Image.
    object | 2007/10/04 12:25 | PERMALINK | EDIT/DEL | REPLY

    저는 컴포넌트 하이어라키가 좀 있는 구조에서 클래스 파괴자에서 virtual 함수 부르다가 purcall assert를 받아서 갸우뚱 거리다가 구글링해서 oldnewthing의 글을 읽고서 고개를 끄덕끄덕....

    • Gravatar Image.
      codewiz | 2007/10/04 13:15 | PERMALINK | EDIT/DEL

      네. 저도 처음에 purecall 메시지를 봤을때는 깜짝 놀랐습니다. 더 황당했던건 그게 스레드 컨텍스트 스위칭 문제랑 결합된 미묘한 문제여서 특정 컴퓨터에서만 발생했다는 점 입니다.

      친잘한 사용자가 화면을 캡쳐해서 보내주기 전까지 모르고 있었죠. ㅎㅎ

  • Gravatar Image.
    어쨌건간에 | 2008/01/15 09:46 | PERMALINK | EDIT/DEL | REPLY

    C++/CLI 코딩 중에선가 본 키워였네요. interop과정 중에 필요한 호출 규약인가 부다 했는데, 요런 황당한 내용이었을 줄이야... 잘 보았습니다~

Name
Password
Homepage
Secret