본문 바로가기
Language&Framework&Etc/C

매크로와 선행처리기(26-3) 조건부 컴파일(Conditional Compilation)을 위한 매크로

by 머리올리자 2020. 12. 18.

매크로 지시자 중에는 특정 조건에 따라 소스코드의 일부를 삽입하거나 삭제할 수 있도록 디자인 된 지시자

#if... #endif: 참이라면

if문이 조건부 실행을 위한 것이라면, #if...#endif는 조건부 코드 삽입을 위한 지시자.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ADD 1
#define MIN 0

int main(void)
{
	int num1, num2;
	printf("두 개의 정수 입력: ");
	scanf("%d %d", &num1, &num2);

/* 
if문의 뒤에는 반드시 #endif문이 등장해야 하고
이 두 지시자 사이에 존재하는 코드는 조건에 따라서 삽입 및 삭제가 된다.
ADD나 MIN이 참이면(=1) 코드가 삽입되고 거짓(=0)이면 코드가 삭제 된다.
*/
#if ADD // ADD가 '참'이라면
	printf("%d + %d = %d \n", num1, num2, num1 + num2);
#endif

#if MIN // MIN이 '참'이라면
	printf("%d - %d = %d \n", num1, num2, num1 - num2);
#endif
}

ADD가 1이기 때문에 덧셈 출력 코드가 삽입이 되지만

MIN가 0이기 때문에 뺄셈 출력 코드는 삭제가 된다.

 

#ifdef... #endif: 정의되었다면

#if는 매크로가 참이냐 거짓이냐를 기준으로 동작한다면,

#ifdef는 매크로가 정의되었느냐, 정의되지 않았느냐를 기준으로 동작한다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//#define ADD 1
#define MIN 0

int main(void)
{
	int num1, num2;
	printf("두 개의 정수 입력: ");
	scanf("%d %d", &num1, &num2);


#ifdef ADD // 매크로 ADD가 정의되었다면
	printf("%d + %d = %d \n", num1, num2, num1 + num2);
#endif

#ifdef MIN // MIN이 '참'이라면
	printf("%d - %d = %d \n", num1, num2, num1 - num2);
#endif

	return 0;
}

위 매크로로 정의된 값은 중요하지 않고, 매크로 자체가 정의되었느냐가 기준으로 작동된다.

 

따라서 아래와 같이 정의해도 된다.

#define ADD
#define MIN

이렇게 매크로가 정의되면 소스코드에 있는 ADD와 MIN은 선행처리 과정에서 공백으로 대체가 된다.

#ifndef... #endif

'매크로 ...가 정의되어 있지 않다면'

n은 not을 의미

 

#else의 삽입 : #if, #ifdef, #ifndef에 해당

#include <stdio.h>
#define HIT_NUM 5

int main(void)
{
#if HIT_NUM==5
	puts("매크로 상수 HIT_NUM은 현재 5입니다.");
#else
	puts("매크로 상수 HIT_NUM은 현재 5가 아닙니다");
#endif
	
	return 0;
}

#elif의 삽입: #if에만 해당

#include <stdio.h>
#define HIT_NUM 7

int main(void)
{
#if HIT_NUM==5
	puts("매크로 상수 HIT_NUM은 현재 5입니다.");
#elif HIT_NUM==6
	puts("매크로 상수 HIT_NUM은 현재 6입니다.");
#elif HIT_NUM==7
	puts("매크로 상수 HIT_NUM은 현재 7입니다.");
#else
	puts("매크로 상수 HIT_NUM은 5, 6, 7이 아닙니다")
#endif
	
	return 0;
}

참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.