2013년 3월 14일 목요일

C++에서 string 함수들

아직도 C++에 익숙하진 않지만, 어쩔 수 없이 C++로 작성된 코드를 많이 접하다 보니 그때 그때 알아가는 수 밖에는....

Linux에서 GameBoy Advanced의 에뮬레이터인 VBA(Visual Boy Advanced)를 컴파일하면서 만나게 된 에러코드 입니다.

컴파일 에러

에러 메시지만으로 보자면 type이 맞지 않아서 발생한 에러인 것으로 보입니다.
문제의 해결은 어렵지 않을 것으로 생각되는 에러이지만,
완성된 프로그램의 Source에서 에러가 발생하는 것이 잘 이해되진 않습니다.


GBA.cpp
해당 Source인 GBA.cpp의 1133 line입니다.
아마도 strrchr()의 첫번째 인자로 사용된 file의 type(const char *)이 문제인가 봅니다.


Man Page
strrchr의 man page를 열어보았습니다.
이상하네요?
첫번째 인자의 type은 const char *가 맞습니다.
그럼 왜 에러가 발생한걸까요?


string.h
헤더파일이 저장되어 있는 /usr/include에서 string.h를 열어 보았습니다.
strrchr()의 함수 프로토타입이  있습니다.
238~256 line은 C++에서 호출될 경우이고 260~261 line은 C에서 호출될 경우입니다.
그런데 C++의 경우에는 함수의 프로토타입이 두가지입니다.

첫번째는 인자가 char *이고 리턴값도 char *입니다.
두번째는 인자가 const char *이고 리턴값도 const char *입니다.
소위 C++에서 얘기하는 함수 다형성(Polymorphism)의 경우인가 봅니다.
그러니까 첫번째 인자가 const char *로 사용된 경우에는 2번째에 해당하며, 리턴값도 const char *형이 되어야 하는 것인데, 우리의 소스에선 첫번째 인자는 const char *이고 리턴값은 char *였기에 문제가 되었던 거죠.


수정한 GBA.cpp
위와 같이 리턴값의 type을 const char *로 수정하니 에러가 발생하지 않습니다.


아마도 C++의 프로그래머들은 통상적인 문자열을 다룰 때, String class를 사용하니 자주 부딪히는 문제는 아닐지도 모르겠습니다.
하지만 어째서 C와는 다르게 C++에서는 "const"가 붙어 있는 경우에 대해서 이렇게 구별을 해 놓았는지 궁금해 집니다.
혹시 reference 변수와 관련된 것일까요?
const가 어디에 위치하는가에 따라 의미가 달랐던 것도 있는데 이것도 명확하지 못하니 저렇게 수정하는 게 뒤끝이 구리구리합니다.

getopt.h
이렇게 소스를 보는 중에 눈에 띈 하나.
char *const * argv
이건 대체 무슨 의미일까요? 에휴~~