Jabi  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'c/c++/c/c++'에 해당하는 글(6)
2009.05.10   괴로운 전처리문 #include, #define, #if, #ifndef, #endif


괴로운 전처리문 #include, #define, #if, #ifndef, #endif

필자가 알고 있는 전처리문은 #include, #define, #if, ,#ifndef, #endif 이렇게 5가지 뿐이다.
전처리문은 저거 말고도 굉장히 많이 있지만 사용해 보지 못했다.
많은 사람들은 오류나 c언어에 대한 호기심에 stdio.h파일을 열어 보았으나 제일 처음에 있는 #~~~~과 온갖 _???로 되어 있는 변수에 막혀 포기 할 것이다.
필자도 마찬가지다 도데체 머가 먼지 모른다.
일단 필자가 배운 전처리문은 저 5가지가 전부다.
기초, 기본 이런 책만 봐서 그런거 같다. ㅡㅡ;;

 #include
#include는 말 안해도 알 것이다.
헤더 파일을 포함 시킬때 사용하는 전처리 문이다.
외부 파일(c언어로 된)을 읽어서 포함 시키는 것이다.
<?????>로 처리 하면 표준 포함 파일 디렉토리에서 가져오고
"?????" 로 처리하면 지금 cpp소스가 있는 현재 디렉토리에서 가져오게 되는 것이다.

#define
보통 상수 값을 지정할 때 사용한다.
하지만 이것은 굉장히 쓰임새가 많다.
함수로도 쓸 수있고 문자열로 저장 할 수도 있다.

상수 값을 지정 할때 사용
#define pi 3.14
전처리기를 써주고 전처리기의 pi를 이용해 출력해보자
printf("%f",pi);
하면 결과로 3.140000이 나올것이다.
(주의 사항) ;는 붙이지 않는다.
필자가 오타가 나서 ;를 안 적은게 아니라 원래 안 적는 것이다.

함수로 사용
#define one(x) ((x) = (x) + (1))
그러면 one()함수를 써보자
int x = 1;
one(x);
printf("%d",x);
이렇게 해주면 2가 출력 될 것이다.
one함수의 리턴값이 없다???
잘 모르겠다.ㅡㅡ;;
이때 까지 리턴값을 써본적이 없다.
(주위사항) 함수를 호출 할때는 반드시 ;를 붙여주자.
one()하면 오류가 난다. 반드시 호출 할때는 ;를 붙이자
반드시 괄호를 써주자 괄호를 써주지 않으면 어느게 먼저 실행될지 모호해져 이상한 결과를 출력 할 수도 있다.

문자열 저장
#define str "hello"
그러면 문자열을 써보자
printf(str);
이렇게 해주면 hello를 출력해준다.
잠깐... 먼가 이상하지 않은가?
원래 라면 printf("%s",str)일텐데......
str자체가 문자열이다.
한마디로 str쓰면 문자열이 나오는 것이다.
char str_arr[] = "hello"; 해주고 printf("%s",str_arr);
해주면 str_arr의 주소값을 찾아서 hello를 출력해주지만
전처리기를 사용하면 문자열을 상수로 만들어서 출력 해주기 때문에
똑같은 출력을 두번 이상 하게 되면 str_arr을 사용한 쪽은 문자열을 한번만 쓰고
전처리기에서 만든 str은 똑같은 문자열을 두번 쓰게 됩니다.
상당히 이해하기 힘드므로 문자열은 전처리기를 이용해서 구현하지 맙시다.
(주의 사항) 문자열은 전처리기로 쓰지마

#if ~ #endif

사용을 먼저 해보자
#define A 1
#if A
코드
#endif
이러면 끝이다.
A가 1이상이면 참이므로 코드가 실행되고 #endif까지만 실행 된다는 뜻이다.

#ifndef

만약에 내가
#include<stdio.h>
#include<stdio.h>
이렇게 두번 선언해 버리면 코드량이 많아진다.
그래서 쓰는 것이 #ifndef이다.
보통 헤더 파일을 코딩 할때 필수 적으로 넣어준다.
my_header.h에 이렇게 코딩해주자

#ifndef MY_HEADER_H
#define MY_HEADER_H
쓰고 싶은 코딩~~~~~~~~~~
#endif

이렇게 해주면 헤더파일을 중복 으로 include시켜도 한번만 include시킨 걸로 된다.
왜?
일단 #ifndef MY_HEADER_H하면 MY_HEADER_H가 선언 되어있지 않으면 밑에 줄이 실행 된다는 뜻이다.
일단 MY_HEADER_H는 선언 되어 있지 않으므로 밑에 줄에는  #define MY_HEADER_H이 실행된다.

일단 이것이 실행되고 나면 먼지 모르겠지만 MY_HEADER_H이 선언되어 버린다.
그리고 #endif를 만날때 까지 코딩된 것이 실행 될 것이다.

만약에 내가 실수로
#include"my_header.h"
#include"my_header.h"
이렇게 두번 선언 하면 처음 선언된 my_header.h만 포함 될 것이다.
처음 선언하게 되면 #define MY_HEADER_H에 의해서 MY_HEADER_H가 정의 되어 버린다.
그리고 나서 다시 my_header.h를 포함 시켰더니 #ifndef MY_HEADER_H에 의해서 밑에줄을 실행 하지 않을 것이다.
역시 복잡하니 그냥 외우거나 예제 소스 파일을 만들어서 들고 다니면서 필요 할때 찾아서 사용하도록 합시다.


#inlcude 사용 방법
이용하는 예: 헤더파일을 포함하기 위해서
표준 포함 파일 디렉토리에서 가져올 경우 #include<?????.h>
현재 디렉토리에서 가져올 경우 #include"?????.h"

#define 사용 방법
이용하는 예: 변경 되지 말아야 할 자료나 함수에서
상수 값 지정
#define pi 3.14
함수로 사용
#define one(x) ((x) = (x) + (1))

#ifndef, #define, #endif 사용 방법
이용하는 예: 헤더파일의 중복 포함을 막기 위해서
#ifndef MY_HEADER_H
#define MY_HEADER_H
쓰고 싶은 코딩~~~~~~~~~~
#endif








name    password    homepage
 hidden


BLOG main image
Jabi
 Notice
 Category
분류 전체보기 (7)
c/c++ (6)
그래픽 (1)
 TAGS
 Calendar
«   2019/10   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
 Recent Entries
이차원 포인터에 이차원 배열을 넣기
오늘 알게 된 struct의 비밀
typedef에 대해서
괴로운 전처리문 #include, #define, #..
이차원 포인터 동적 할당
 Recent Comments
 Recent Trackbacks
 Archive
2010/05
2009/05
2009/04
 Link Site
 Visitor Statistics
Total : 46,158
Today : 1
Yesterday : 4
rss