본문 바로가기

컴퓨터/언어,프로그래밍

[스크랩] #ifndef ~ #endif 와 #pragma once 의 차이점

header 파일의 중복 include 로 인한 error 를 방지하기 위해서 흔히들 사용하는 방법들이다.

흔히들 #ifndef ~ #endif 를 사용하는데 예를 들면,

- a.h file -
#ifndef _A_H_
#define _A_H_
...
#endif

이렇게 사용해서 header 파일의 중복으로 인한 compile error을 예방한다. 이 경우에 macro wrapper 를 이용해 특정 macro로 선언되어 있으면 #endif 까지의 영역이 모두 무효화 되는 방식을 이용하는 기법이다.
하지만 이 기법의 경우 중복되는 header 파일이 발견될 때마다 계속해서 그 header 파일을 scan 해야하므로 compile 시간이 오래 걸리게 된다.
macro wrapper 방식의 경우 preprocessor가 파일을 계속 읽어서 #ifndef 문의 비교조건을 검사해야 하기 때문에 그런 것이다.

#pragma once 의 경우 compiler 에게 (preprocessor) #pragma once가 선언된 파일을 한번만 읽으라고 하는 것이므로 macro wrapper의 효과와 동일하다. 또한, macro
wrapper와 다르게 해당 파일이 존재할 때마다 매번 파일을 scan 하지 않기 때문에 compile time 이 상당히 빨라질 수 있다. (대규모 프로젝트의 경우)
하지만 macro wrapper와 다르게 "Not standard" (표준이 아님) 이기 때문에 compiler에 따라 오동작이나 제대로 인식되지 않을 경우가 있으니 확실히 알아보고 사용하는 것이 중요하다.

* macro wrapper 의 경우 #ifndef ~ #endif 에 정의할 name이 들어가는데 일반적으로 file 이름을 사용하는 경우가 일반적이다. 하지만 project가 클 경우 서로 다른 module에서 같은 이름을 가진 header 파일이 존재할 수 있다. (이 경우 진짜 골치 아파진다... ㅠㅠ) 그러므로 단순히 파일이름으로 macro wrapper를 사용하기 보다 좀 더  unique 할 수 있게 module 이름과 project 이름까지 곁들인다면, 좀 더 명확하게 구분하고 side effect을 방지할 수 있을 것이다.

http://songhl1.tistory.com/229
제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...