53: 컴파일러 경고를 지나치지 말자
심각한 문제라면 에러가 나올 것이라고 생각하고 경고를 무시하면 안 된다. C++의 경우에는 우리가 저질러 놓은 코드가 어떤 것인가에 대해 컴파일러 제작자가 우리보다 더 잘 이해하기 있기를 바라는 것 자체가 큰 도박이다.
class Base {
public:
virtual void f() const;
};
class Derived : public Base {
public:
virtual void f();
};
위의 코드는 가상 함수인 B::f 를 D::f 에서 재정의(redefine, 오버라이드)하겠다는 의도인데, 여기에 실수가 있다. B클래스의 f 함수는 상수 함수지만 Derived 클래스의 f는 괄호 뒤에 const가 없다. 이러면 책의 필자의 컴파일러는 다음과 같은 경고가 나온다.
warning: D::f() hides virtual B::f()
지금 컴파일러는 f가 D에서 재선언된 것이 아니라 아예 가려졌다는 사실을 목 놓아 외치고 있다. 이 경고를 무시하고 지나갔다가는 프로그램이 십중팔구 이상하게 동작하게 될 것임은 당연하다. 결국 컴파일러가 처음 잡아낸 그 부분을 넘어간 것이 문제였다는 사실을 한참 후에야 알게 될 것이다.
경고 메시지들에 어느 정도 익숙해지고 나면, 어떤 경고는 넘어가도 되고 어떤 경고는 없애 주어야 하는지를 선택할 수 있는 공력이 쌓인다. 물론, 최고 경고 수준을 걸더라도 경고 메시지 없이 컴파일되는 코드를 작성하는 것이 일반적으로 더 좋은 실천법이다. 중요한 것은, 그 경고가 알리려는 바를 정확히 이해해야 한다는 것이다.
컴파일러 경고는 제작사마다 달라지는 것이므로, 컴파일러 경고에 너무 의존하면 안 된다.
이것만은 잊지 말자!
- 컴파일러 경고를 쉽게 지나치지 말자. 컴파일러에서 지원하는 최고 경고 수준에도 경고 메시지를 내지 않고 컴파일되는 코드를 만드는 쪽에 전력을 다하자.
- 컴파일러 경고에 너무 기대는 인생을 지양하자. 컴파일러마다 경고를 내는 부분들이 천차만별이기 때문이다. 지금 코드를 다른 컴파일러로 이식하면 익숙해져 있는 경고 메시지가 사라질 수도 있다.
'C++ > Effective C++' 카테고리의 다른 글
[Effective C++] 55: Boo子有親! 부스트를 늘 여러분 가까이에 (1) | 2023.11.27 |
---|---|
[Effective C++] 54: TR1을 포함한 표준 라이브러리 구성요소와 편안한 친구가 되자 (1) | 2023.11.26 |
[Effective C++] 52: 위치지정 new를 작성한다면 위치지정 delete도 같이 준비하자 (0) | 2023.11.24 |
[Effective C++] 51: new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자 (0) | 2023.11.22 |
[Effective C++] 50: new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자 (1) | 2023.11.21 |