#include <stdio.h>


위의 코드는 C언어를 코딩할 때, 정말 수없이 봐오던 문장이다.

위를 통해서 유추할수 있는 전처리기의 특징은

1) #을 적는다

2) 세미콜론; 이 없다

3) 한줄씩 선언되며 #뒤에 어떤 명령이 온다.


짐작했듯이 #뒤에는 include명령 말고도 다양한 명령이 올수가 있다.

대표적인 전처리기의 명령 몇가지만 소개하자면 아래와 같다.



- 파일 처리를 위한 전처리기 문 : #include


- 형태 정의를 위한 전처리기 문 : #define, #undef


- 조건 처리를 위한 전처리기 문 : #if, #ifdef, #ifndef, #else, #elif, #endif


- 컴파일 옵션 처리를 위한 전처리기 문 : #pragma

http://blog.naver.com/since860321?Redirect=Log&logNo=130163293294



이중에서 오늘은 조건처리에 대해서 아래의 지식인 답변을 통해서 이해해보자.





질문

c++ #ifdef #ifndef #endif 이런거 설명좀요 .. 내공25

tto**** 
질문 486건 질문마감률61%
 
2012.03.12 01:20
10
답변
 
3
 
조회
 
8,444

#ifdef

#ifndef

#endif

 

이것들에 설명좀 해주세여요

 

#define 이 되있다면

?

안되있따면?

 

#endif ??

 

제가 보통 사용하는

 

그냥 공통적으로 필요한 헤더를 모아놓고

 

한번만 선언해놓거나 구조체를 모아놔서

 

#define 이란 header 만 하나 추가시켜놓고 거기에 몰아넣어서

 

그냥 선언하는 식으로 사용할떄

 

#ifndef __DEFINES_H__

#define __DEFINES_H__

 

....

 

#endif

 

이런식으로 쓰곤했는데 사실 이게 pragma once인가 그거

 

한번만 선언? 인가.. ( 자세힌 모르지만요 ) 하게 만든다고 하기 위해 한다고 하던데

 

고수님들 소스를 보면

 

#ifdef 소스~~~

#else

 소스~~~

#endif

소스~~~

막 이런식으로 저런게 되게 cpp 에도 잇꼬 header 에도 잇고

 

저런거 어떻게 사용하죵 ??



질문자/네티즌 채택

re: c++ #ifdef #ifndef #endif 이런거 설명좀요 ..

rantsu 
답변채택률96.7%
 
2012.03.12 02:19
답변 추천하기

질문자 인사

진심 감사합니다 아 이런 훌륭한 답변들이 .. !

님이 질문하신것을보고 "전처리기"라고 합니다.

전처리기에 대한 간단한 예를 들자면요.

윈도우를 보면 홈에디션, 프로페셔널 등등 각종 버젼이 있지요?
마이크로소프트에서 윈도우 버전을 만들때 홈에디션 따로, 프로페셔널 따로 만들까요? 
그렇지는 않겠지요?

이와 마찬가지로 님이 만약에 인터넷에서 파일을 다운받는 프로그램을 만들었습니다.
여기에 속도제한을 두고 싶어요. 
무료로 배포할때는 최고 속도를 10으로 돈주고 사는 사람에게는 최고 속도를 100으로 하고 싶습니다.

#ifdef PRO_VER
#define MAX_SPEED 100
#else
#define MAX_SPEED 10
#endif

이렇게 해두고 제어코드는 다음과 같이 하면 되겠지요?
if( speed > MAX_SPEED )
    speed = MAX_SPEED; // 최고속도를 초과하면 강제적으로 최고속도로 되돌림.

자.. 이렇게 작성을 마친후에...

유료버전을 만들기 위해 컴파일러 옵션에서 PRO_VER를 참으로 지정을 해서 컴파일을 합니다.
#ifdef PRO_VER
#define MAX_SPEED 100 <- 여기에 해당되어 컴파일
#else
#define MAX_SPEED 10
#endif
그럼 이 실행파일은 최고속도로 100을 갖게 됩니다.

무료버전을 만들기 위해 PRO_VER를 거짓으로 해서 컴파일을 합니다.
#ifdef PRO_VER
#define MAX_SPEED 100
#else
#define MAX_SPEED 10 <- 여기에 해당되어 컴파일
#endif

자~ 불필요하게 소스코드를 수정하지 않고, 컴파일러 옵션 설정만으로도 유료, 무료버전을 별도로 만들었습니다. 편리하죠?


이밖에 어떤 프로그램을 윈도우 버전, 리눅스 버전을 따로 만들어 배포하고 있습니다.
근데 C코드이기 때문에 대부분이 중복되고, 극히 일부분만 다르기 때문에 코드를 따로 관리하기가 힘듭니다.
그럼 어떻게 하면 되죠?

#ifdef WINDOWS
// 윈도우일때 필요한 코드
#else
// 리눅스일때 필요한 코드
#endif

동일한 코드는 그냥 놔두고, 극히 일부분만 다른 코드만 이런식으로 처리를 해줍니다.
그럼 컴파일할때 역시 코드 수정없이 윈도우버젼, 리눅스버젼 프로그램을 따로 만들 수 있는 겁니다.

뭐.. 이밖에도 통신환경을 설정한다거나 윈도우 버전별로 다른 처리를 하는 등등..
온갖 처리에 전처리기를 사용하게 됩니다.

이해가 되셨는지요?



아주 명쾌하다. 간단한 예제를 통해서 어떤식으로 사용되고있는지 까지 설명을 아우른다.

아무래도 답변자는 제대로 프로그래밍 언어를 아는듯 하다 ㅎ

암튼 몇가지 명령을 모아서 본다면 아래의 표와 같다.



 형식

내용 

 #if 

 ~이 참이라면 

 #ifdef

 ~이 정의되어 있지 않다면

 #ifndef

 ~이 정의되어 있지 않다면

 #else

 #if나 #ifdef에 대용된다

 #elif

 else if의 의미

 #endif

 #if, #ifdef, #infdef가 끝났음을 의미


지시어설명
#include <파일이름>미리 정의된 include 폴더에서 파일을 찾는다.
#include "파일이름"현재의 소스 코드가 저장되어 있는 폴더에서 먼저 찾고,
파일이 없다면 미리 정의된 include 폴더에서 파일을 찾는다.

#error


컴파일러 오류 메시지를 발생


#import


파일을 추가한다.


#elif


Else if


#else


Else


#ifndef


식별자가 정의되어 있지 않으면 참


#ifdef


식별자가 정의되어 있으면 참


#endif


#findef나 #ifdef, #else에 대한 전처리기 부분을 종료


#line


내부 행 넘버를 변경한다.


#undef


식별자를 정의하지 않는다.


#progma

링크할 때 헤더 파일이 한 번만 포함되게 한다







: c++ #ifdef #ifndef #endif 이런거 설명좀요 ..

easyflowinc 
답변채택률34.2%
 
2012.03.12 11:16
답변 추천하기
안녕하세요.

선행 처리기(preprocessor)란 소스프로그램이 컴파일되기 전에 미리 소스프로그램에 대해 일련의 작업을 하는것입니다.

예를들면, 프로그램 상에 기술된 약식표현을 모두 원래의 표현대로 바꾸어주는 역할을 하거나, 다른 프로그램 내에 포함시키는 등의 역할을 합니다. 일반적인 C컴파일러(compiler)는 소스프로그램 전체를 선행 처리기로 일단 처리한 다음 계속해서 컴파일(compile)하고 마지막으로 링크(link)하여 실행 가능한 프로그램(.EXE 파일)을 생성합니다.

 

컴파일러의 입장에서 보면 선행 처리기에 의해서 먼저 처리된 중간 프로그램을 소스프로그램의 일종으로 취급합니다.

즉, 선행 처리기는 목적 프로그램(기계어 프로그램)을 생성하는 것이 아니라, 선행 처리기가 하는 작업은 원시 프로그램을 컴파일하기 좋도록 가공하는 작업이라 할 수 있습니다. 다시 말해서 선행 처리기는 원시 프로그램 내의 모든 선행 처리기 지시어를 컴파일 할 수 있는 C 언어의 문장으로 바꾸어 주는 작업을 수행합니다.

 

선행 처리기의 대표적인 지시어는

#define

#include

#if

#else

#endif

...

등 여러가지가 있습니다.


위와같은 선행처리기 명령들은 조건적인 컴파일을 가능하게 해 줍니다.

큰 프로그램일수록 조건부 컴파일을 많이 합니다.


#ifdef OPTION

 

#include "aaa.h"

#define bbb 5


#else


#include "ccc.h"

#define ddd 15


#endif


위의 프로그램은 이전에 배운 조건문과 비슷한 구조이므로 쉽게 파악할 수 있습니다.

마지막에 endif 는 블럭이 끝남을 알리는 선행 처리기 명령입니다


#ifdef지정어는 그 다음에 오는 명칭,

1. (OPTION)이 선행처리기로 정의되었으면, 그 지점 다음에서 #else 전 까지 사용합니다.

2. (OPTION)이 선행처리기로 정의되어있지 않으면,  #else 다음부터 #endif 전까지 사용합니다.

 

다시말해, OPTION이 정의되었는가에 따라 소스코드를 선택하여 컴파일 할 수 있도록 합니다.


#if SYS == "AndroidPC"

#include "Android.h"

#endif


이러한 조건 컴파일의 용도는 주로 프로그램의 호환성을 높이기 위하여 많이 사용합니다.

파일의 앞 부분에 있는 몇 개의 중요한 정의만 바꾸면 다른 시스템을 위한 다른파일을 포함하여 사용할 수 있습니다.

출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=147544009&qb=I2lmZGVm&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=RxRH4lpySo8ssZxVfxKsssssssK-050019&sid=UxU5IgpyVo8AAExsNIE


네이버 지식iN. 


다른 전처리기와 관련 예제코드들:

http://blog.naver.com/pointer98?Redirect=Log&logNo=150036254254


명확한 typedef의 사용법 : 

http://blog.naver.com/pure_evil?Redirect=Log&logNo=60196169024





  

'Engineering > C Language' 카테고리의 다른 글

[C언어] 비트연산자와 16진법  (0) 2014.02.27
[C++] 구조체와 클래스  (0) 2014.02.24
[C언어] 메모리구조와 동적할당  (0) 2014.02.21
[본문스크랩] enum의 사용법  (1) 2014.01.28
[C언어] 구조체사용하기  (0) 2014.01.16

+ Recent posts