C++ 프로그래밍

C++ using namespace를 헤더 파일에 사용하지 말자

하늘흐늘 2021. 12. 1. 16:31
반응형

using namespace는 특정 네임스페이스의 클래스들을 네임스페이스 참조 없이 사용하기 위하여 흔히 사용하는 문법입니다. 흔한 예로는 STL을 사용하기 위하여 사용하는 using namespace std;와 같은 것이 있습니다.
네임스페이스를 생략하는 편의성 때문에 헤더에 using namespace를 사용하니 아래와 같은 문제가 발생하였습니다.
현재 개발 중인 프로젝트에서 사용하는 라이브러리들이 STL, Boost, MongoCXX, Cybos API등인데 같은 클래스이름 때문에 충돌이 발생하였습니다. 헤더 파일에서야 원인을 파악하고 클래스 앞에 네임스페이스를 넣어줘서 충돌을 막아줄 수 있었습니다. 
그런데 cpp파일에서는 using namespace 구문이 있는 헤더가 포함되니 포함 순서에 따라서 컴파일 에러 메서지로는 알기 힘든 컴파일 에러가 발생하였습니다. 이 컴파일 에러는 헤더 포함 순서를 바꾸면 해결되기는 합니다. 에러의 원인은 포함한 hpp(주로 템플릿 프로그래밍에 사용이 되는 헤더 파일로 구현 내용을 포함하는 파일)에서 이름이 충돌하는 다른 네임스페이스의 클래스를 사용하기 때문인 것 같았습니다.
헤더 포함 순서에 따라 컴파일 에러가 나는 상황을 방치할 수 없어, 결국 헤더에 있는 using namespace 구문을 모두 제거하였습니다. 그리고 아래와 같은 추가적인 문제점을 발견하였습니다.
헤더에 using namespace가 있다보니 포함관계에 따라서 cpp파일에서 명확하게 using namespace로 지정하지 않은 namespace의 클래스를 사용하고 있었습니다. 이런 현상은 포함 헤더 파일이 변경되게 되면 컴파일 에러가 발생하는 포함과 관계되어 소스가 꼬이는 문제를 발생시킬 수 있습니다.

결론적으로 말하여 헤더 파일에 using namespace를 사용하는 것은 현재는 문제는 발생시키지 않을 수도 있지만 차후에 추가적인 라이브러리가 추가되거나 cpp파일에서 포함 파일의 변경에 따라 문제를 발생시킬 수 있으니 사용하지 않는 것이 좋은거 같습니다.

반응형