언어/기타
2006.09.30 05:26

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

조회 수 1015 추천 수 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
번호 분류 제목 글쓴이 날짜 조회 수
521 언어/기타 [자작]마름모형 거리 재기 A. 미스릴 2006.10.22 1548
520 언어/기타 스토리아이디어 B HERO 2006.10.22 1212
519 언어/기타 "빵과 유통기한" EverSmileMan 2006.10.21 1890
518 언어/기타 캐릭터 행동에 대한 팁? mk_brand_ 2006.10.12 1205
517 언어/기타 Love One 7차 체험판 자유의지 2006.10.10 1952
516 언어/기타 약간의 아이디어.. 닉네임군 2006.10.08 1264
515 언어/기타 게이지 시스템 [액알의 게이지 같은 거 아니에요. ] S.단이한 2006.10.07 1528
514 언어/기타 스타 맵을 만들어 볼까? -폭피 1- file 다크세이버™ 2006.10.05 424
513 언어/기타 스타 맵을 만들어 볼까? -폭피 2- file 다크세이버™ 2006.10.05 451
512 언어/기타 if개요 dnajs 2006.10.05 324
511 언어/기타 if문 dnajs 2006.10.05 407
510 언어/기타 관계형연산자 dnajs 2006.10.05 380
509 언어/기타 논리 연산자 dnajs 2006.10.05 348
508 언어/기타 비트 연산자 dnajs 2006.10.05 471
507 언어/기타 [수정]반복루프 무시하기 Kain_Kryun 2006.10.04 502
» 언어/기타 선행처리기 지시어. (#???) 연지 2006.09.30 1015
505 언어/기타 스타 맵을 만들어볼까? -트리거 1- file 다크세이버™ 2006.09.28 392
504 언어/기타 MSN 주소를 알려주세요. 1 MrGeek 2006.09.28 401
503 언어/기타 스타 맵을 만들어 볼까? -기초 4- file 다크세이버™ 2006.09.27 403
502 언어/기타 [연재/딤삐의 VNAP 강의] 1. 비주얼노벨을 만들자! - 0강. 강의를 시작하기 전에 (1) 만삐 2006.09.26 856
Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 ... 36 Next
/ 36






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

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