'#ifdef'에 해당되는 글 1건

전처리문이란?

 

컴파일 이전에 미리 처리되는 문장을 말합니다또한 선행처리기라고도 말합니다. 여기서 컴파일러는 여러분들이 작성하신 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 코드들을 우선적으로 수행합니다.

전처리문들의 종류로는 #include, #if, #define, #ifdef, #defined, #ifndef, #undef 등이 있습니다. 기존에 작성한 소스 코드들을 건드리지 않고, 부분적인 컴파일을 수행합니다.

 

 

C, C++의 전처리문이 시작하는 Line의 첫 글자는 ‘#’으로 시작합니다.

ANSI 표준에 따른 C의 전처리문의 종류는 아래와 같습니다.

파일 처리 : #include

형태 정의 : #define, #undef

조건 처리 : #if, #ifdef, #ifndef, #else, #elif, #endif

에러 처리 : #error

디버깅 : #line

컴파일 옵션 처리 : #pragma

 

조건 처리를 위한 전처리문은 조건에 대한 검사를 수행하며, 그 결과를 True, False로 반환합니다.

#if : …이 참이라면

#ifdef : …이 정의되어 있다면

#else : #if #ifdef에 대응.

#elif : else + if”의 의미

#endif : #if, #ifdef, #infdef 이 끝났음을 알림.

 


#include

헤더 파일(외부파일)을 읽어서 함수를 포함시키고자 할 때 사용됩니다. 

이때 외부파일은 C의 소스파일과 같은 형태의 일반 문서파일을 말합니다.


1

2

#include <stdio.h>    // 이 소스(위치)에 stdio.h의 파일의 내용을 포함시킨다. 

#include "text.h"       // 이 소스(위치)에 text.h라는 파일의 내용을 포함시킨다. 

cs


#include<> 를 사용할 때는 컴파일러의 라이브러리 폴더를 참조할 때 '<>'를 사용합니다.

#include"" 를 사용할 때는 현재 디렉토리에서 헤더파일을 참조할 때, 주로 사용자가 생성한 헤더파일을 참조할때 ' "" '를 사용합니다.


#define

상수값을 지정하기 위한 예약어. 전처리기 지시자라고 하며, #define으로 선언하면 구문을 상수로 변환합니다.
또한 #define은 상수선언과 더불어 함수로도 사용이 가능합니다.


1

2

#define PI 3.14

#define SUM (x,y) { x + y }

cs


위와 같이 #define 까지의 구문을 전처리기 지시자 라고 하며, PI는 상수라고 칭합니다.


1

2

3

#define PI 3.14

 

double PI = 3.14;

cs


위와 같이 두 코드가 있다고 가정하면 결과는 비슷해 보이지만 엄밀히 말하면 다릅니다.

#define 구문은 '단순한 치환' 입니다. 예를들어 가정해봅시다.

예를 들어 '내 생일'이 31일 이라고 가정한다면 '#define 내생일 31' 이라고 선언할 수 있을겁니다.

또한 '내생일 - 1'을 하면 31 - 1로 30이 나올것입니다.

'내생일' 이라는건 문자임에도 불구하고 실제로는 31이라는 정수를 대신하고 있는것이죠.

별명의 개념이라고 생각하시면 될 것 같습니다.

제 이름과 별명이 있지만 둘 중 하나만 불러도 알 수 있는것 처럼요.

따라서 위 코드를 보게되면 PI도 3.14를 대신하고있는 '상수' 입니다.


상수의 값은 변경할 수 없으며, 이렇게 상수에 이름을 붙여주는 것을 매크로 상수 라고 합니다.

매크로 상수는 컴파일 후에 'PI'의 값을 3.14로 아래 주석부분처럼 치환한다고 이해하시면 될 것 같습니다.


1

2

3

4

5

6

7

8

9

#include <stdio.h>

 

#define PI 3.14

 

int main(){

    

    printf("PI = %.2lf", PI);

    //printf("PI = %.2lf", 3.14);

}


cs


또한 #define으로 함수 또한 정의할 수 있습니다. 이는 '매크로 함수' 라고 칭합니다.

아래 코드를 살펴봅시다.


1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

 

#define DuckBae(x,y) { x + y }

 

int main(){

    int num1 = 1;

    int num2 = 2;

    int result = 0;

 

    result = DuckBae(num1, num2);

 

    printf("%d\n",result);

}

cs


여기서 보면, result = DuckBae(num1, num2); 가

result = num1 + num2; 로 바뀌게 됩니다. 


#undef

앞에서 #define으로 이미 정의된 매크로를 무효화합니다.


1

2

#define DuckBae(x,y) { x + y }

#undef DuckBae(x,y)

cs


라고 하면 앞으로 사용되는 DuckBae(x,y) 매크로 함수는 ‘undefined symbol’이 되어 에러처리합니다.


#ifdef

#ifdef 헤더명_H__  ~ #endif 구문으로 실행하는 매크로입니다.


헤더파일이 겹치는 것을 막기위해 사용합니다. 



1

2

#include <stdio.h> //====(1)

#include <stdio.h> //====(2)

cs



위와같이 동일한 구문을 두번 썼다고 가정해봅시다.

1번 Line에서 이미 include를 했는데, 밑에서도 include한다면 문제가 되겠지요?

또한 컴파일러가 검사하는 코드도 늘어납니다. 

그래서 stdio,h에는 아래와 같은 코드가 선언되어 있습니다.



1

2

#ifndef STDIO_H__

#define STDIO_H__

cs



stdio.h가 선언되어있지 않으면 선언한다는 구문입니다.

그래서 stdio.h를 (1)에서 먼저 선언했기 때문에 전처리기 단에서 무시합니다.

컴파일러 또한 (1)만 검사를 합니다.




이상으로 전처리문에 대한 포스팅을 마칩니다! 글 잘 보셨다면 아래 하트 꾹 눌러주세요!

블로그 이미지

덕배님

5년차 S/W 개발자입니다. Android, Unity, JAVA, C, C++, C# 정보를 공유합니다

,