본문 바로가기
c언어

c언어 #ifdef와 #endif, #ifndef, #undef에 대하여 알아보기

by 개발자 L 2023. 2. 21.
반응형

c언어 #ifdef와 #endif, #ifndef, #undef에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 #ifdef와 #endif에 대하여 알아보도록 하겠습니다.

우리가 전처리를 쓸 때 코드 전반에 적용이 되는 것들만 썼었는데,

이번에는 특정한 조건에서만 쓰는 전처리기에 대하여 알아보도록 하겠습니다.

그럼 바로 시작하도록 하겠습니다.

 

1. 조건부 컴파일 지시자 : #ifdef, #endif

조건부 컴파일 지시자는 어떤 조건이 만족되는 경우에만 지정된 코드 블록을 컴파일하도록 하는 지시자입니다.

이럴 때 쓰는 지시자가 바로 '#ifdef'입니다.

사용 방법은 아래와 같습니다.

#ifdef DEBUG
    printf("value = %d\n", value);
#endif

이런 식으로 씁니다.

#ifdef가 조건부 컴파일의 시작을 알리는 전처리기이고,

#endif로 조건부 컴파일을 종료시킵니다.

그래서 이 둘 사이에 있는 모든 문장들을 해당 매크로를 검사하여 매크로가 정의가 되어 있다면 컴파일을 시킵니다.

그 반대의 경우에는 이 두 매크로 안에 있는 문장들을 컴파일하지 않아서 실행 코드에 들어가지 않습니다.

제일 대표적인 사례가 바로 위에 제가 작성한 코드입니다.

주로 디버깅을 할 때 쓰이는데,

코드 작성을 하고서 오류가 있는지 의심이 가는 구간에다가 넣어서 변수의 값들을 출력할 때 씁니다.

위 코드를 활용을 해본다면 이렇게 할 수 있겠죠?

일반적으로 조건부 컴파일을 쓰지 않고서 하는 방법은 아래와 같습니다.

int avg(int x, int y)
{
    ...
    printf("x = %d, y = %d\n", x, y);
    ...
}

이러한 코드가 있다고 가정을 해봅시다.

위 출력문은 디버깅할 때 저런 식으로 먼저 값이 제대로 나오는지 출력을 하기 위해 만들어놓은 코드인데,

이렇게만 써놓으면 컴파일 시에 저 줄이 계속 컴파일이 되기 때문에 메모리를 그만큼 더 잡아먹어서 효율적이지 않습니다.

그래서 이 구간을 이런 식으로 묶어주는 겁니다.

int avg(int x, int y)
{
    ...
    #ifdef DEBUG
        printf("value = %d\n", value);
    #endif
    ...
}

이런 식으로 묶어서 디버깅을 해준다면 조건에 따라서 컴파일이 되거나 되지 않습니다.

여기서 중요하게 눈여겨봐야 할 것은 이겁니다.

'DEBUG'라는 매크로가 정의가 되어있지 않다면 스킵이 됩니다.

왜냐하면 조건부 매크로는 이런 식으로 기호 상수화 시켜 정의해 놓은 것이 컴파일되어있을 경우에

이들을 호출하여 실행하는 기능을 가지고 있기 때문입니다.

그래서 DEBUG라는 매크로가 정의가 되어있지 않다면 해당 매크로는 실행 코드에 아예 들어가지 않습니다.

그리고 해당 기호 상수는 소스 첫 부분에서 정의를 해놓거나,

캄파일을 할 때 옵션으로 제공을 하기도 합니다.

그래서 디버깅 테스트를 할 때는 제일 첫머리에 이런 식으로 써주시면 됩니다.

#define DEBUG

이러면 컴파일된 전처리기임을 인식하기 때문에 저 조건부 컴파일이 수행이 되고,

나중에 필요가 없어진다면 저 기호 상수 정의를 내린 줄만 지우면 알아서 실행 코드에서 지워버립니다.

 

2. 매크로는 어디서 정의할까?

보통 #fidef의 조건으로 사용이 되는 매크로는 코드 시작 부분에서 정의가 되기도 하지만,

보통은 대부분의 컴파일러에서 소스를 건드리지 않고 컴파일러의 대화 상자에서 변경할 수 있게 합니다.

보통 우리가 쓰는 IDE 프로그램들을 보게 되면 전처리기 속성을 조작할 수 있어서 그렇게 하면 됩니다.

반응형

 

3. i#fndef

#ifndef의 경우는 #ifdef와는 반대되는 전처리기인데,

매크로가 정의가 되어있지 않을 경우에 컴파일에 포함을 시키고,

그 반대의 경우라면 컴파일에서 제외가 되게 됩니다.

사용 방법은 이렇습니다.

#ifndef LIMIT // LIMIT이 정의가 되어있지 않으면
#define LIMIT 100 // 정의를 해줌
#endif

 

4. #undef

#undef의 경우에는 매크로의 정의를 취소하는 기능을 가지고 있습니다.

이건 이전에 정의했던 매크로를 다시 정의하고 싶을 때 씁니다.

그래서 이전의 정의를 무효화하고 재정의 합니다.

사용 방법은 이렇습니다.

#define SIZE 100
...
...
#undef SIZE // SIZE 정의 취소
#define SIZE 1000

 

여기까지 #ifdef와 #endif, #ifndef, #undef에 대하여 알아보았는데요,

다음 포스팅에서는 #if, #else, #endif에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 감사합니다~

반응형

댓글