반응형
원문 :
http://www.gamedev.net/page/resources/_/reference/programming/languages/c-and-c/organizing-code-files-in-c-and-c-r1798
C와 C++에서 Header(h, hpp)와 Source(cpp, c)를 여러 파일로 분리하는 이유는 다음과 같다.
- 빠른 컴파일 : 10000줄 파일 하나를 1000줄짜리 파일 10개로 분리한다면, 수정된 파일만 컴파일하여 빠르게 컴파일 가능하다.
- 논리적 구조화 : 쓰임새나 구조 등에 따라 적절히 분리한다면 추후 검색이 쉽고 논리적인 구조를 쉽게 익힐 수 있다.
- 코드 재사용 : 논리적 역할에 따라 적절히 분리되어 있다면 필요한 부분만 쉽게 재사용 할 수 있다.
- 책임의 분리 : 여러명의 프로그래머가 작업을 한다면 각자 작업하는 파일에 따라 책임을 분리할 수 있다.
일반적으로 Header에는 다음과 같은 것들을 선언한다.
- class, struct, (inline) 함수 선언
- template 구현
- typedef
- 전역 변수, 상수 선언
- #define, #pragma
하지만 많은 프로그래머들이 Header 관리를 잘못하여 다음과 같은 문제들을 발생시키곤 한다.
1. 잘못된 Header Include
2. 상호참조
3. 중복참조
4. 중복 인스턴스 생성
각각의 예와 해결법은 아래에서 밝히도록 하겠다. (원문에 자세히 설명되어 있습니다.)
1. 잘못된 Header Include
2. 상호참조
3. 중복 참조
4. 중복 인스턴스 생성
http://www.gamedev.net/page/resources/_/reference/programming/languages/c-and-c/organizing-code-files-in-c-and-c-r1798
C와 C++에서 Header(h, hpp)와 Source(cpp, c)를 여러 파일로 분리하는 이유는 다음과 같다.
- 빠른 컴파일 : 10000줄 파일 하나를 1000줄짜리 파일 10개로 분리한다면, 수정된 파일만 컴파일하여 빠르게 컴파일 가능하다.
- 논리적 구조화 : 쓰임새나 구조 등에 따라 적절히 분리한다면 추후 검색이 쉽고 논리적인 구조를 쉽게 익힐 수 있다.
- 코드 재사용 : 논리적 역할에 따라 적절히 분리되어 있다면 필요한 부분만 쉽게 재사용 할 수 있다.
- 책임의 분리 : 여러명의 프로그래머가 작업을 한다면 각자 작업하는 파일에 따라 책임을 분리할 수 있다.
일반적으로 Header에는 다음과 같은 것들을 선언한다.
- class, struct, (inline) 함수 선언
- template 구현
- typedef
- 전역 변수, 상수 선언
- #define, #pragma
하지만 많은 프로그래머들이 Header 관리를 잘못하여 다음과 같은 문제들을 발생시키곤 한다.
1. 잘못된 Header Include
2. 상호참조
3. 중복참조
4. 중복 인스턴스 생성
각각의 예와 해결법은 아래에서 밝히도록 하겠다. (원문에 자세히 설명되어 있습니다.)
1. 잘못된 Header Include
/* Header1.h */ #include "header2.h" class ClassOne { ... }; /* Header2.h */ class ClassTwo { ... }; /* File1.cpp */ #include "Header1.h" ClassOne myClassOne_instance; ClassTwo myClassTwo_instance;이 경우 Header1.h에서 Header2.h를 include 할 필요는 없다. 해당 include를 File1.cpp로 옮기도록 한다.
2. 상호참조
/* Parent.h */ #include "child.h" class Parent { Child* theChild; }; /* Child.h */ #include "parent.h" class Child { Parent* theParent; };이러한 상호참조는 include 대신 전방선언을 하여 해결하도록 한다.
3. 중복 참조
/* Header1.h */ #include "header3.h" class ClassOne { ... }; /* Header2.h */ #include "header3.h" class ClassTwo { ... }; /* File1.cpp */ #include "Header1.h" #include "Header2.h" ClassOne myClassOne_instance; ClassTwo myClassTwo_instance;Header1과 2에서 모두 Header3을 Include 하였다. 이 경우는 Header3에 #pragma once 구문이나 #ifndef _HEADER_DEF_ #endif를 통해 해결하도록 한다.
4. 중복 인스턴스 생성
/* Header.h */ #ifndef INC_HEADER_H #define INC_HEADER_H int my_global; #endif /* INC_HEADER_H */ /* code1.cpp */ #include "header1.h" void DoSomething() { ++my_global; } /* code2.cpp */ #include "header1.h" void DoSomethingElse() { --my_global; }header1이 여러곳에서 include 되므로 my_global이 여러 인스턴스로 생길 수 있다. 이러한 것은 header에 extern으로 선언하고 cpp에서 정의하는 것으로 해결할 수 있다.
반응형
'Game Dev > Scrap' 카테고리의 다른 글
No files were found to look in. Find was stopped in progress. (0) | 2013.05.24 |
---|---|
HDR (High Dynamic Range) (0) | 2010.12.24 |
개발의 현실 (0) | 2010.04.27 |
Smooth Shadow Researches (0) | 2009.09.25 |