#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와 쌍이고요..