Linux에서 GameBoy Advanced의 에뮬레이터인 VBA(Visual Boy Advanced)를 컴파일하면서 만나게 된 에러코드 입니다.
컴파일 에러 |
에러 메시지만으로 보자면 type이 맞지 않아서 발생한 에러인 것으로 보입니다.
문제의 해결은 어렵지 않을 것으로 생각되는 에러이지만,
완성된 프로그램의 Source에서 에러가 발생하는 것이 잘 이해되진 않습니다.
GBA.cpp |
아마도 strrchr()의 첫번째 인자로 사용된 file의 type(const char *)이 문제인가 봅니다.
Man Page |
이상하네요?
첫번째 인자의 type은 const char *가 맞습니다.
그럼 왜 에러가 발생한걸까요?
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 |
아마도 C++의 프로그래머들은 통상적인 문자열을 다룰 때, String class를 사용하니 자주 부딪히는 문제는 아닐지도 모르겠습니다.
하지만 어째서 C와는 다르게 C++에서는 "const"가 붙어 있는 경우에 대해서 이렇게 구별을 해 놓았는지 궁금해 집니다.
혹시 reference 변수와 관련된 것일까요?
const가 어디에 위치하는가에 따라 의미가 달랐던 것도 있는데 이것도 명확하지 못하니 저렇게 수정하는 게 뒤끝이 구리구리합니다.
getopt.h |
char *const * argv
이건 대체 무슨 의미일까요? 에휴~~