'프로그래밍 기초/C '에 해당되는 글 2건

  1. 2010.02.21 헤더파일중복문제
  2. 2010.02.21 extern


#pragma는 단순히 define나 include와 같이 #으로 시작되는 전처리문의 하나입니다.

대단한 용법은 아닙니다.

다만 편의성과 기능성을 제공해 주죠.

현재 자신이 사용하고 있는 컴파일러가 이녀석을 지원해 준다면

이전글에서 헤더파일 중복문제 해결을 위한 방법보다 좋은 성과를 보여줄 겁니다.

이전글의 내용이 생각나지 않는 분을 위해 이곳에 이전글의 핵심 내용을 간단히 보여 드리죠.

 

// 헤더 파일의 제일 첫 부분
01: #ifndef HDR_H     // 헤더 파일명을 대문자한 매크로가 정의되어 있지 않으면
02: #define HDR_H    
// 헤더 파일명 매크로를 정의한다

......                // 헤더 파일 본 내용이 여기 들어갑니다

03: #endif            // ifndef HDR_H 에 매치됩니다

 

위와 같이 헤더 파일을 작성하게 되면 다음과 같은 과정이 일어나게 됩니다.

컴파일러와 역지사지해서 생각해 보겠습니다.

1. 처음으로 헤더 파일이 포함될 때, 컴파일러(좀 더 정확히 말하면 프리프로세서)가

01 라인을 만나게 되면 HDR_H 매크로가 정의되어 있지 않으므로 02 라인을 해석하게 됩니다.
2. 02 라인을 만나면 이제 HDR_H 매크로를 정의하게 됩니다.
3. 다음에 다시 같은 헤더 파일이 포함될 때는 HDR_H이 정의되어 있기 때문에

모든 헤더 파일의 내용을 스킵하게 됩니다. 즉, 포함되지 않는 효과가 생기게 됩니다.

 

이러한 방법을 include guard (포함 보호)라고 합니다.

이 방법도 무척 훌륭한 방법입니다.

다만 사용자 입장에서 실수할 여지가 많다는 겁니다.

매크로 이름의 충돌가능성등 말이죠.

물론 어지간한 프로젝트에서는 이런 일은 발생하기 어려울 겁니다 ^^a...

그리고 include guard는 한번 읽은 헤더파일도 일단 헤더파일의 내용을 다 읽어야 합니다.

시간낭비고 컴파일러 컴력 낭비(ㅡㅡ;) 이고 효율낭비이죠.

 

pragma는 이러한 면에서 확실히 뛰어납니다.

이녀석의 경우는 각 파일별로 프리프로세서가 include한 상태를 기억하고 있어서

한번만 include한다면 이후로 다시 읽어야하는 지루한 일은 안한다는 겁니다.

 

오~ pragma녀석... 무척좋군~

하시는 분도 있을겁니다.

하지만 안타깝게도 이녀석은 표준이 아닙니다.

즉, 이녀석을 사용하여 프로그램을 짠다면 다른 어떠한 환경에서는

이녀석을 지원해주지않는일을 보게 될 겁니다.

그 외에도 문제가 있지만 가장 큰 문제는 표준이 아니라는 점이죠.

 

그럼 이제 슬슬 고민이 되겠죠?

도대체 어떤놈을 써란말이야~~!!

결론은 이겁니다. 내부 포함보호와 외부 포함보호를 적절히 활용하라.

이전에 헤더파일 중복 문제해결방법은 내부 포함보호방법이었죠.

 

#ifndef HDR_H
#include "hdr1.h"
#endif

 

요런방법이 외부 포함 보호방법입니다.

이 방법을 사용하면 include guard의 문제점인 컴파일 속도측면에서의

비효율성 문제를 극복할 수 있습니다.

 

기억하세요.

손쉽고 편한 pragma 를 사용하여 이식성을 한껏 낮추는 것 보다는

내부 - 외부 포함 보호 방법을 적절히 활용하여 헤더파일 중복을 막는것이

더 올바른 자세란 것을요.


출처 - http://blog.naver.com/khercules

'프로그래밍 기초 > C' 카테고리의 다른 글

extern  (0) 2010.02.21
Posted by 아몰라
2010. 2. 21. 02:32
 

프로그램이 만들어지는 과정에는

전처리기 - 컴파일 - 링킹 - 실행파일생성 이런 단계로 이루어져있다.


전처리기
는 앞에 #이 붙은 것들을 처리하는데

특정 함수나 변수가 있는 라이브러리들을 끌어올때 사용한다.


컴파일
은 라이브러리를 참고해서 각각 특정언어로 작성된 코드들을

기계어코드인 오브젝트파일로 바꾸어준다.

extern 키워드는 선언한 변수나 함수가 현재 파일에는 없고 다른곳에 정의된

것이라는 것을 컴파일러에 알려주는 목적으로 사용된다.


마지막으로 링킹과정은 생성된 오브젝트들을 연결을 시켜서 하나의

실행파일로 만드는 과정이다.


컴파일 과정에서 에러가 나지 않았지만 링킹과정에서 에러가 발생하는 경우가 많이 있는데

그것을 컴파일때에 함수 정의나 변수가 없더라도 다른곳에서 선언되었다고 컴파일러가 묵시적으로 이해를 하는데,

링킹과정에서 그 함수, 변수를 못찾아서 에러가 발생하는 경우이다.
(extern으로 .h파일에 변수를 명시적 선언했지만 c파일에서 실질적으로 선언하지 않은경우)

 

extern 으로 선언된 변수는 컴파일러에게 요 변수가 다른곳에서 정의되어 있다는 것을 알려준다.

컴파일 타이밍에 메모리에 잡히지 않고  단지 컴파일러에게 이러한 변수가 있으니 현재 파일을 컴파일 할때 에러를 보내지 말라고 알려주는역할을 한다.

'프로그래밍 기초 > C' 카테고리의 다른 글

헤더파일중복문제  (0) 2010.02.21
Posted by 아몰라
이전버튼 1 이전버튼