C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[916] 헤더파일에 직접 객체 변수 선언하기 - 다른 의견
크레브 [kkol] 12653 읽음    2009-09-11 20:37
아래 에 있는 김태선님의 글은
헤더 파일에 변수 선언을 그냥 쓰면  에러가 발생하므로
static 을 사용하여 에러 발생하는 것을 막는다는 내용이다.

이것은  C언어 문법이므로 C언어 기초 문법부터 공부하지 않고
중간에 C++만 대충 공부한 사람이나
기초 문법 공부를 소홀히 한 사람은 잘 모르는 경우가 있을 것이다.

그냥 모르기만 하면 다행인데..
초보자들 중에 그렇게 선언한 변수가 동일한 메모리 공간을 사용한다고
심각한 착각을 하는 경우가 있다.


예를들어

xx.h에

static int count;

를 선언하고



a.cpp 와 b.cpp에 include 했을 경우 각각의 cpp 파일에서 count 란 변수는 별개의 메모리 공간을 차지한다.
하지만 이와 같이 써놓고
a.cpp에서 count = 100; 이라고 하면 , b.cpp내의 코드에서도 count는 100이 들어가 있다고
착각하는것이다.

이것은 심각한 버그를 초래할 수 있기 때문에
개인적으로 상당히 좋지 않은 방법이라고 생각한다.


또한

static int count = 1; 

이라고 초기화를 했을 경우에

빌드 속도를 향상 시키기 위해 이 헤더 파일을 프리 컴파일 하려고 다음과 같이 hdrstop 위로 올렸다면

#include "xx.h"

#pragma hdrstop

다음과 같은 경고가 뜨면서 프리 컴파일 헤더를 만들수 없다고 나온다.
실제로도 프리컴파일드헤더가 생성되지 않는다.

Warning : W8058 cannot create pre-compiled header : initialized data in header

해당 헤더 파일이 전체 소스에 걸쳐서 사용되는 공통 헤더일 경우에
프리 컴파일을 생성 못하면 전체 빌드 시간은 심각하게 느려지게된다.
테스트 해보니 초기하 안하고 아래와 같이 선언만 해도 같은 Warning가 발생한다.
static int count ;





실제 업무에서 첫번째와 같은 메모리 관련 내용을 모르는 초보자 때문에 버그가 발생한 경우도  있었고

두번째와 같은 경우 때문에 Pre compiled header를 못만들어서

다시 선언을 cpp 파일로 하고 *.h 에는 extern으로 다시 다 바꾸어 작업한 적도 있었다



개인적으로는 어떤 장점이 있는지 모르겠지만

가능하면 이런 방식은 되도록 안쓰는것을 추천한다.

+ -

관련 글 리스트
916 헤더파일에 직접 객체 변수 선언하기 - 다른 의견 크레브 12653 2009/09/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.