티스토리 뷰
namespace를 대충 알긴 하지만 한번도 제대로 써본 적이 없었다.
실제 프로젝트에서도 사용할 수 있도록 namespace에 대해 더 알아보자.
namespace 분할 컴파일
namespace를 헤더에 정의해두고 전체 프로젝트에서 접근할 수 있도록 하려고 하니 header를 여러군데에서 include 했을 때 중복 정의되어 링크에러가 발생했다.
클래스가 선언과 정의를 분리하는 것처럼 namespace도 분리하여 구성하고 변수를 extern으로 설정하여 전역변수화 시키는 것으로 해결했다.
// name2.h
namespace Name2{
extern int a;
void func();
}
// name2.cpp
#include "name2.h"
int Name2::a = 0;
void Name2::func(){
// 내용
}
// pro3.cpp
#include "name2.h"
using namespace Name2;
// ...
위처럼 header와 cpp를 분리해서 구현하니 해결되었다.
namespace를 사용하면 기본적으로 코드 들여쓰기가 1레벨 적용된다.
그냥 무시할 수도 있지만 기본적으로 들여쓰기 레벨이 깊은 코드는 가독성이 떨어지며 namespace의 경우 들여쓰기가 없어도 코드를 이해하는데 어려움이 없기 때문에 들여쓰기를 안하는 방향이 좋겠다.
cocos2d 엔진과 c++의 std library 등에서는 대괄호를 특정 문자열로 재정의하여 들여쓰기를 방지한다.
#define NS_CC_BEGIN namespace Cocos2d{
#define NS_CC_END }
#define USING_NS_CC using namespace Cocos2d;
NS_CC_BEGIN
class A{
//...
};
NS_CC_END
위처럼 디자인하는 것의 장점은 문제점이었던 들여쓰기를 방지할 수 있을 뿐 아니라 namespace의 이름을 쉽게 변경할 수 있다.
'Programming > C++' 카테고리의 다른 글
C/C++ - assert (0) | 2016.12.28 |
---|---|
C/C++ - 가변인자 ... (0) | 2016.11.19 |
동적할당한 stl::list 해제하기 (0) | 2016.09.11 |
함수 콜 성능을 향상시키자 - #pragma intrinsic (0) | 2016.03.20 |
C++ Reference : 널 포인터(nullptr) (0) | 2015.08.03 |
- Total
- Today
- Yesterday
- 수학
- 데이터베이스
- 드라마
- 운영체제
- C
- SwiftUI
- 자료구조
- Java
- rxswift
- scala
- C/C++
- DesignPattern
- winsock
- Spring
- 알고리즘
- JSP
- database
- SHADER
- ios
- game
- machine learing
- swift
- OS
- ue4
- 국내여행
- SOCKET
- Cocos2d-x
- Git
- C++
- mongoDB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |