본문 바로가기
c언어

c언어 #if, #else, #elif, #endif에 대하여 알아보기

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

c언어 #if, #else, #elif, #endif에 대하여 알아보기

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

이전 포스팅에서 배웠던 #ifdef와 같이 조건부 컴파일을 하는 전처리기들인데요,

이들에 대하여 좀 더 자세하게 알아보는 시간을 가져보도록 하겠습니다.

그럼 지금부터 시작하겠습니다.

 

1. #if의 조건부 컴파일

#ifdef의 경우는 매크로의 값은 상관하지 않았지만, #if의 경우는 매크로의 값에 따라서 컴파일 여부를 결정합니다.

그리고 #if는 우리가 잘 쓰는 if문과 비슷하게 관계 연산자나 논리 연산자를 쓸 수 있습니다.

그리고 그 조건은 상수 수식이어야 합니다.

예를 들자면 이렇게 할 수 있겠네요.

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

위 예제처럼 어떤 조건에 따라서 컴파일이 되고 안 되고 가 결정이 됩니다.

지금 위 코드의 경우에는 DEBUG의 값이 1일 경우에 값을 출력하라는 조건부 매크로가 걸린 것입니다.

그래서 그 이외의 값이라면 컴파일이 되지 않습니다.

반응형

 

1 - 1. 다중 #if문 컴파일 하기

#if 역시 다중 if문을 쓰는 것 처럼 쓸 수 있는데요,

바로 보여드리도록 하겠습니다.

#define NATION == 1

#if NATIION == 1
    printf("안녕하세요!");
#elif NATION == 2
    printf("你好!");
#else
    printf("Hello World!");
#endif

이런 식으로 쓸 수 있습니다.

우리가 c언어에서 if - else if문을 쓴 것처럼 말이죠.

그런데 여기서는 else if 대신에 elif를 썼습니다.

파이썬에서는 elif를 쓰는데, c언어에서는 전처리기로 조건부 매크로를 걸 때 씁니다.

이 점에 대하여 차이가 있다는 것을 알아두셔야 합니다.

그리고 #if를 써서 작성 가능한 것과 불가능한 것들을 좀 보여드리도록 하겠습니다.

#if(AUTHOR == KIM) // KIM은 다른 매크로이기 때문에 가능함
#if(VERSION*10 > 500 && LEVEL == BASIC) // 매크로에 대한 논리 연산이기 때문에 가능함
#if(VERSION > 3.0) // 버전 번호는 실수가 아닌 정수형으로 표현해야 하므로 오류가 남
#if(AUTHOR == "CHULSOO") // 문자열은 숫자가 아니므로 오류가 남

// #if로 전체 주석 처리하기
#if 0
void test()
{
// 이 부분에 주석이 있을 경우 코드 전체 주석 처리는 어려움.
add();
}
#endif // 여기까지 주석 처리

이러한 것들이 가능합니다.

 

여기까지 #if, #else, #elif, #endif에 대하여 알아보았습니다.

다음 포스팅에서는 다중 소스 파일에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글