Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

로또

53. 컴파일러 경고를 지나치지 말자. 본문

책/Effective C++

53. 컴파일러 경고를 지나치지 말자.

아롱로또 2024. 1. 6. 11:27

다루는 내용

예제를 통해 컴파일러가 말하는 경고와 우리가 이해하는 바가 다를 수 있음을 깨닫고, 컴파일러 경고를 다루는 올바른 자세를 알아보자.

컴파일러 경고 예제

#include <iostream>
using namespace std;

class B{
public:
    virtual void f() const
    {cout << "B::f()" << endl;}
};

class D: public B{
public:
    virtual void f()
    {cout << "D::f()" << endl;}
};

이러한 코드를 g++ -W -Wall을 이용해 직접 컴파일한 결과, 이러한 코드에 대해 어떤 경고 메세지도 찾아볼 수 없었다.

이전에는 다음과 같은 경고 메세지가 발생했다고 한다.

warning: D::f() hides virtual B::f()

 

컴파일러는 D::f()가 B::f()를 가린다고 경고하고 있다. 우리는 가상 함수를 사용해 함수를 override함으로 당연히 가리도록 하고 싶었기에 이러한 경고를 무시해도 된다고 생각할 수 있다.

하지만 컴파일러가 말하고 싶은 것은 다음과 같다. B에서 선언된 f가 override된 것이 아니라 아예 가려졌다.

 

문제 상황을 파악하기 위해 main 함수를 다음과 같이 추가해보자.

다음과 같이 문제없이 실행되는 모습을 볼 수 있다.

int main()
{
    D d;
    d.f();
}

실행 결과

이번에는 상수 객체를 사용해보자.

상수 객체는 상수 함수만을 호출할 수 있음을 코드 작성자가 알고 있다면, 위와 같은 가상 함수를 사용했을 때 코드 작성자가 호출되길 원하는 함수는 부모 클래스의 상수 함수인 B::f()일 것이다.. 

int main()
{
    const D d;
    d.f();
}

하지만 다음과 같은 컴파일 에러가 발생한다.

컴파일 에러

 

"33. 상속된 이름을 숨기는 일은 피하자." 에서 배웠던 것처럼, 부모 클래스의 이름을 사용할 수 있도록 using 선언을 사용하여 다음과 같이 코드를 변경해보자.

class B{
public:
    virtual void f() const
    {cout << "B::f()" << endl;}
};

class D: public B{
public:
    using B::f;
    virtual void f()
    {cout << "D::f()" << endl;}
};

int main()
{
    const D d;
    d.f();
}

실행 결과

컴파일 오류없이 컴파일되며 원하는 대로 실행되는 모습을 볼 수 있다.

 

 

컴파일 경고를 대하는 올바른 자세 

위처럼 컴파일러가 내뱉는 경고와 실제 뜻이 다른 경우가 다반사이다. 경험이 쌓일수록 어떤 경고는 넘어가도 되고, 어떤 경고는 없애 주어야 하는지를 선택할 수 있는 공력이 쌓이지만 컴파일러가 최고 경고 수준으로 컴파일을 진행하더라도 출력되는 경고 메세지 없이 일반적으로 더 좋은 실천법이라고 한다.

 

가장 중요한 것은 어떤 경고 메세지를 없애기 전에, 그 경고가 우리에게 알리려는 바를 정확히 이해해야 한다는 것이다. 또한 컴파일러 경고는 제작사마다 다르므로 우리가 저지른 실수를 컴파일러가 대신 잡아주는 것만 믿고 아무 생각 없이 프로그래밍 하는 자세는 굉장히 나쁘다.

 

 

이것만은 잊지 말자!

  • 컴파일러 경고를 쉽게 지나치지 맙시다. 여러분의 컴파일러에서 지원하는 최고 경고 수준에도 경고 메시지를 내지 않고 컴파일되는 코드를 만드는 쪽에 전력을 다 하십시오.
  • 컴파일러 경고에 너무 기대는 인생을 지양하십시오. 컴파일러마다 트집을 잡고 경고를 내는 부분들이 천차만별이기 때문입니다. 지금 코드를 다른 컴파일러로 이식하면서 여러분이 익숙해져 있는 경고 메세지가 온데간데 없이 사라질 수도 있습니다.