언어/기타
2006.09.30 05:26

선행처리기 지시어. (#???)

조회 수 1040 추천 수 4 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

 


             #???


 


 


 


 


 


 


 


 


 


 



 


(1) #define


#define라는 지시어는 매크로 기능을 수행하는 지시어 입니다.


기본적인 사용법은 다음과 같습니다.


#define 매크로명 [값]


이렇게 해 두면 프로그램 내에서 매크로명과 같은 이름을 가진 단어들을


모두 값으로 바꿔 줌니다. 그리고 여기서 값은 없어도 되죠.


예를 들어


#define DATA 10


이렇게 해 주면 프로그램 내에 DATA라는 단어를 모두 10으로 바꿔 주게 됨니다.


즉 프로그램에서

if(a==DATA)
{
   .
   .
}

이렇게 쓴 것은 실재로는

if(a==10)
{
   .
   .
}

이렇게 되어 버리는 것 입니다.


#define라는 지시어로는 함수와 같은 매크로도 만들수 있습니다.


만드는 방법은 다음과 같죠.


#define 매크로함수명([인수, 인수, ...]) [문장]


이때 인수는 일반 함수의 인수와 똑같은 용도로 쓰입니다.


즉 값을 전달에 주는 역활을 하죠. 물론 없어도 상관 없고요.


그리고 문장은 매크로의 내용으로 인수들을 쓸수 있죠.


그럼 예를 들어 보죠.


#define FUNC(a,b) printf(a,b);


이렇게 매크로를 만들었다고 합시다.


그리고 프로그램 내에서 이 매크로를


FUNC("%d",10);


이렇게 사용했다면 이건 선행처리기가 지시어를 번역한 후에는


printf("%d",10);


이렇게 되어 버리는 것 입니다.


이정도면 이해가 되셨겠죠?


(2) ##와


매크로를 만들때만 사용할수 있는 몇가지 지시어가 있는데,


바로 ##와 입니다.


##는 함수와 같은 매크로에서만 사용하는 것으로


두가지 인수를 연결시켜 버리는 기능을 합니다.


예를 들어


#define MACRO(a,b) a##b


이렇게 매크로를 만들었다고 합시다.


프로그램에서 이 매크로를


a=MACRO(First,Last);


이렇게 사용했다면


실재로는 두 인수 First와 Last가 연결되어


a=FirstLast;


이렇게 되는 것 입니다.


는 매크로의 내용이 너무 길때 여러줄에 쓰기 위해 필요한 것입니다.


줄 맨 끝에 를 붙여 주면 그 아랫줄에 계속 연결하여 쓸수 있게 되는 것이죠.


예를 들어


#define MACRO(a,b,c) a=b+c; printf("%dn",a); a=b-c; printf("%dn",a)


이런 매크로가 있다고 합시다.


이건 를 써서 다음과 같이 쓰면 보기도 쉽고 만들기도 쉽죠.

#define MACRO(a,b,c) a=b+c; 
                     printf("%dn",a);
                     a=b-c;
                     printf("%dn",a)

(3) #undef


#define로 만든 매크로를 없엘때는 어떻게 할까요?


그때 #undef라는 지시어를 사용합니다.


사용법은 다음과 같죠.


#undef 매크로명


여기서 매크로명은 없에려고 하는 매크로의 이름으로


이미 만들어 져 있는 것이어야 합니다.


이렇게 해 주면 해당 매크로는 없어져서


더이상 사용할수 없게 됨니다.
(4) #if-#elif-#else-#endif


#if-#elif-#else-#endif는


선택적 매크로 선언이나 선택적 컴파일 기능을 하는 매크로 입니다.


C언어 프로그램 흐름제어중 if문과 비슷하죠.


사용법은 다음과 같습니다.

#if 조건A
   /* A부분 */
   .
   .
#elif 조건B
   /* B부분 */
   .
   .
.
.
#else
   /* else부분 */
   .
   .
#endif

여기서 조건A가 만족하면 A부분만을 조건B가 만족하면 B부분만을...


그리고 어떤 조건에도 만족하지 않으면 else부분만을


컴파일 해 주게 됨니다.


그리고 #elif부분과 #else부분은 없어도 됨니다.


조건은 일반 C언어의 관계형 연산자와 논리 연산자 그리고 defined라는 것을


사용한 조건 이지만 변수같은건 사용될수 없고


매크로를 사용할수 있습니다.


예를 들어


DATA1 == DATA2


이런 조건은


DATA1이란 매크로와 DATA2라는 매크로의 값은 같다


라는 조건 입니다.


그리고 defined는 특정 매크로가 만들어져 있으면 참을


그렇지 않으면 거짓을 돌려 주는 기능을 하는데,


사용법은 다음과 같습니다.


defined(매크로명)


이때 매크로명에 해당하는 매크로가 만들어져 있으면 참을


그렇지 않으면 거짓을 돌려주죠.


그럼 한가지 예를 들어 보죠.

#define MACRO 10

#if !defined(MACRO)
printf("MACRO not foundn");
#elif MACRO == 0
printf("MACRO = 0n");
#elif MACRO == 5
printf("MACRO = 5n");
#elif MACRO == 10
printf("MACRO = 10n");
#else
printf("MACRO = Another valuen");
#endif

다음과 같은 내용이 있을때


실재로 컴파일 되는 것은 어떤 문장 일까요?


당연히


printf("MACRO = 10n");


이 문장 이겠죠.


잘 분석해 보시면 왜 그런지는 아시게 되실 겁니다.


(5) #ifdef-#else-#endif


#ifdef-#else-#endif는 #if-#elif-#else-#endif와 비슷하지만


다른 조건들을 줄수 없고 단지 어떤 매크로가 만들어져 있을겨우


특정 부분을 컴파일 시켜 주는 기능을 합니다.


사용은 다음과 같이 합니다.

#ifdef 매크로명
   /* A부분 */
   .
   .
#else
   /* B부분 */
   .
   .
#endif

여기서 매크로명에 해당하는 매크로가 만들어져 있을경우


A부분을 그렇지 않으면 B부분을 컴파일 합니다.


그리고 #else부분은 없어도 됨니다.


(6) #ifndef-#else-#endif


#ifndef-#else-#endif는 위에 #ifdef-#else-#endif와 거의


똑같습니다. 하지만 위에것에선 어떤 매크로가 만들어져 있을때


특정 부분을 컴파일 시키는 것이지만, 이건 특정 매크로가


만즐어 져 있지 않을때 특정 부분을 컴파일 시켜 주는 것 입니다.


사용은

#ifndef 매크로명
   /* A부분 */
   .
   .
#else
   /* B부분 */
   .
   .
#endif

이렇게 합니다. 여기서 매크로명에 해당하는 매크로가 만들어 져 있지


않으면 A부분을 그렇지 않고 만들어져 있으면 B부분을 컴파일 해 주고


#else부분을 없어도 됨니다.


(7) #error


#error라는 지시어는 에러를 발생시켜 컴파일을 중지 시키는 지시어 입니다.


지금은 별로 쓸 일이 없지만 언젠간 꼭 쓸 일이 있을 겁니다.


사용은 다음과 같이 합니다.


#error 에러내용


여기서 쓴 에러내용이 컴파일 할때 표시가 되며, 컴파일이 중지 됨니다.


 


 


 


 


                                                                 (끝)


 


 


 


 


 


 


 


 


 


 


 


 


 

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
701 언어/기타 [마지막 3명 모집] [취업연계무료교육] VR/AR 게임 콘텐츠 전문가 양성 과정 교육생 모집 file 황금상자 2017.07.14 702
700 언어/기타 JSON parser 변환데이터 저장시 생기는 Object Too Deep 해결하기 title: 댓글러lklslel 2016.12.24 851
699 언어/기타 앙뜨프리너십에서 해커톤 부트캠프 모집중이네요 file 마나님이 2016.11.08 908
698 언어/기타 게임의 버전을 짜 보자! - 유의적 버전 2.0.0 Yanggaeng 2016.06.07 1123
697 언어/기타 RPG게임 뻔한요소들. 8 title: 천무천무 2015.10.05 1644
696 언어/기타 자바스크립트와 관련해서 참고할 만한 사이트들 3 MARCO 2015.10.04 921
695 언어/기타 꿀잼이군요! 3 사람님[대회참가] 2015.05.20 873
694 언어/기타 [강의링크] 대비법칙-색상대비-밀당의 재미 약한 반대색 설계 title: 천무천무 2015.04.02 636
693 언어/기타 오다 주웠습니다. 9 사람님[대회참가] 2015.03.30 917
692 언어/기타 무료 이미지 사이트 Pixabay! 9 file 나작소 2015.03.28 909
691 언어/기타 페인터(코럴) 브러쉬 세팅 공유 :) 8 file 샤이귤군 2015.03.28 1577
690 언어/기타 유화재료 & 기법 살짝 팁 공유 (매우 깁니다 -3-) 11 file 샤이귤군 2015.03.28 912
689 언어/기타 픽사에서 텍스쳐 꽁짜로 뿌림ㅋ 8 사람님(대회참가) 2015.03.26 912
688 언어/기타 멀티해상도에 따른 속도와 가속도 값의 조절 1 MiDtics2 2013.01.13 859
687 언어/기타 [Android] 멀티스크린 노하우 2 MiDtics2 2012.10.27 1516
686 언어/기타 [js] 코드 압축 걸음마 2 1 2012.06.12 1059
685 언어/기타 [css] css 겉핥기 핥핥 1 file 2012.05.03 938
684 언어/기타 [css, js] form - select안의 option들에 스타일 적용하기 4 file 2012.04.28 5364
683 언어/기타 게임,개발기획의 기초 5 Grand 2011.08.01 2901
682 언어/기타 지형설정에서 원경(앞, 뒤)가 가지는 역할 file Dicky 2011.07.28 2491
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 36 Next
/ 36


[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)