카테고리 없음

분할 소스 작성

디버그정 2011. 1. 5. 13:00

한 cpp 파일 소스가 너무 길면, 관리는 그렇다 쳐도,
비주얼 스튜디오 에디터가 제대로 작동하지 않는다.

분할 소스로 작성하지 않고 복사-붙여넣기 신공으로 하나의 cpp에 마구 집어 넣었더니,,,
어느새 텍스트 용량이 1메가가 넘는다.
비주얼 스튜디오 에디터가 제대로 작동하지 않는다.
에디터에서 함수 이름을 치면 해당 함수로 가는 편리한 기능이 있는데 소스가 길어서 인지
이러한 인덱싱이 제대로 작동하지 않는다. 엉뚱한 곳에 가버린다.
그리고 도저히 못 참는 건 소스의 마지막 부분에 가서 편집하려고 하면 버벅이는 사태가 일어난다.
문자를 입력하거나 엔터를 치거나, 복사, 붙여넣기 작업을 하려고 하면
심심찮게 20초간 먹통이 되었다가 반응한다.
어처구니 없는 사태다.

분할 소스 작성을 정리해 본다.
=================================================================================================
main.h - 프로젝트 공통 참조하는 매크로, 전역변수 extern 선언 및 Main.cpp의 함수 선언  // extern 주의
main.cpp - 프로그램 골조 함수 및 전체에서 사용하는 전역변수 정의 이를 테면 g_hMain 등
A.cpp - A기능 소스 및 A소스에 포함시키는 게 좋은 전역변수 정의
A.h - 위 A소스의 매크로, 함수 선언 및 A소스 전역변수 extern 선언
B.cpp - B기능 소스 및 A소스에 포함시키는 게 좋은 전역변수 정의
B.h - 위 B소스의 매크로, 함수 선언 및 B소스 전역변수 extern 선언
=================================================================================================

헤더화일에서는 정의부분인 알짜 소스를 포함하지 않고 선언적인 내용만 포함시키는 게 좋다.
참고로 전역변수는 무조건 extern으로 하는 게 좋다.
예를 들어
main.h에서는 extern HWND g_hMain;으로 해두고
main.cpp에서는 HWND g_hMain=NULL;
이런 식으로 작성한다.
주의할 점은 extern HWND g_hMain=NULL; 이렇게 하면 안된다.
이것은 선언은 물론이거니와 정의까지 같이 해버리는 문장이기 때문이다.
extern 사용시 =(equal) 사용 안하기에 유의하자.

헤더화일은 여러군데서 되는 대로 마구 붙여쓰므로
extern으로 해야 중복정의 에러의 귀찮음을 피할 수 있다.
define 매크로나 extern 변수 선언이나 함수의 선언은 실제 정의가 아니고 존재한다는 것을
알려주는(선언하는) 역할만 하므로 여러번 중복 되어도 상관없다.

헤더 파일 작성시 다음과 같은 형식을 따라준다.
// blackhole.h 파일인 경우
#ifndef __BLACKHOLE_H_GOODJOB
#define __BLACKHOLE_H_GOODJOB
//~~~~~~
내용 작성
//~~~~~~
#endif

이렇게 하면 헤더파일을 여러군데서 포함시켜도 컴파일러가 젤 먼저 만나게 되는 헤더화일 내용만
포함하게 될 것이다. 이 경우 첫 포함작업에서 블랙홀굿잡 부분이 정의되므로 다음번에 만나면
#endif부분으로 건너뛰게 되어 중복 포함의 문제는 생기지 않게 된다.

//////////////////////////////////
위와 같은 형식이 원칙적이고 대규모로 작성할 경우에 유용하지만
소규모 개인 프로젝트인 경우는 다음과 같이 하는게 편하다.
=================================================================================================
main.h - 프로젝트 전체의 모든 매크로, 전역변수 extern 선언 및 모든 함수 선언  // extern 주의
main.cpp - 프로그램 골조 함수 및 전체에서 전역변수 정의 이를 테면 g_hMain 등
A.cpp - A기능 함수 소스 및 A소스에 포함시키는 게 좋은 전역변수 정의
B.cpp - B기능 함수 소스 및 A소스에 포함시키는 게 좋은 전역변수 정의
=================================================================================================
A.h나 B.h를 작성할 필요가 없으니까 편하다.~~~;;; 뭐 기능별 모듈화가 안된다고 볼 수 있으나
위 헤더 내용들을 main.h에 싸잡아 넣으니 편하다.
main.cpp나 A.cpp나 B.cpp나 모두 #include "main.h"만 하면 되니 심플하다.