2010년 4월 15일 목요일

전처리 구문에 대해

#define, #ifndef, #ifdef, #endif... 등등이 쓰이는 이유는

컴파일 하기 처리한다는 뜻이죠.

저 구문들을 먼저 처리한 뒤 컴파일이 이루어집니다.

 

이해를 돕도록 한 가지 예를 들겠습니다.

 

//  먼저 아무 의미 없어보이는 HELLO를 define했습니다.

#define HELLO

 

//  여기서 의미가 생기죠. 이 구문을 해석하면 "HELLO가 define이 되었다면.."입니다. 일반 if와 다르지 않습니다.

#ifdef HELLO

printf("Hello\n");

#else                 // 이건 HELLO가 define되지 않았다면..이 되겠죠

printf("Bye\n");

#endif                // end if 즉 if를 끝낸다...뭐 그런 뜻이죠

 

그럼 이 코드가 어떻게 되냐면..

printf("Hello\n");

이거 하나만 컴파일 됩니다.

 

만약에 printf("Bye\n");를 prif"Bye\n"); 이 따위로 써도 컴파일 시 에러가 안납니다.

 

그럼 왜 printf("Bye\n"); 같이 쓰지도 않을 코드를 써서 낭비하는가...

 

프로그램을 많이 짜다가 보면

어쩔 때는 printf("Hello\n");로 컴파일 해야하고

어쩔때는 printf("Bye\n");로 컴파일 해야할 때가 있습니다.

이게 한 줄이면 모르겠지만...

100줄 1000줄..이러면 일일이 컴파일 할 때마다 주석처리하기 엄청 짜증나겠죠.

이럴 때 #define HELLO만 살짝 손보면 컴파일 결과가 사사삭 바뀌니 엄청 편리합니다.

 

 

그럼 질문하신 부분중에

#ifndef TURBOC_HEADER

#define TURBOC_HEADER

 

ifndef는 if no define...if not define??? 뭐 그런겁니다.

그래서 TURBOC_HEADER가 define되지 않았다면 TURBOC_HEADER를 define해라...

뭐 그런겁니다.

 

이게 왜 필요하냐면..

프로젝트가 커질 수록 헤더파일을 여기 저기서 가져다 쓰게 됩니다.

그럼 컴파일시 같은 내용을 반복해서 컴파일 하게 되고 에러가 발생할 수도 있습니다.

질문하신 코드의 경우 #include문이 여러개 있는데 한번만 하면 될 일을 여러번 할 수도 있다는 겁니다.

분명히 에러의 소지도 있고요. (아주 쉬운 예로 전역변수를 헤더에 선언했다면 바로 에러나겠죠)

 

그래서 TURBOC_HEADER가 define되지 않았다면 define하고 헤더를 컴파일하고..

또 다른 곳에서 헤더를 컴파일 하려고 하면 이미 TURBOC_HEADER가 define 되었으니까

그냥 넘어가겠죠.

MFC같은 것을 할 때는 이런 구조가 기본적으로 생성됩니다. 그만큼 꼭 필요한 구조입니다.

 

#endif는 #ifndef와 쌍이고요..

 

출처: http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68987639&qb=YysrIOunpO2BrOuhnOqwgCDrqLzqsIDsmpQ=&enc=utf8&section=kin&rank=1&sort=0&spq=0

댓글 없음:

댓글 쓰기