전처리 지시문

MS learn challenge 전처리 지시문

 

전처리기 지시문

자세한 정보: 전처리기 지시문

learn.microsoft.com

https://learn.microsoft.com/ko-kr/cpp/preprocessor/preprocessor-directives?view=msvc-170

#define

매크로 함수라 한다. 단순 치환이 된다.

  • 장점: 함수 호출이 아니므로 실행속도가 빠름
  • 단점: 실제 코드로 변경되므로 코드 사이즈가 늘어남 
#define SUM(a,b) a+b

int main()
{
	int result = SUM(3, 5);
	
	return 0;
}

 

#undef

정의된 매크로를 해제한다.

정의되지 않은 매크로에 해제에 대한 에러가 발생하지 않는다.

다수의 소스파일에서 정의된 매크로를 재정의할 때 사용한다.

#ifdef ~ #endif , #ifndef  ~ #endf

단일 매크로 확인에 적합하다. 간결하고 읽기 쉽다.

#include <stdio.h>

#define RELEASE
// #define DEBUG

#ifdef DEBUG
int main()
{
	printf("debug mode\n");
	return 0;
}
#endif

#ifdef RELEASE
int main()
{
	printf("release version\n");
	return 0;
}
#endif

#if ~ #elif ~ #else ~ #endif

&&, ||, ==, !=, >, < 등 연산 기호를 사용할 수 있다.

#if defined 

#ifdef와 동일하게 사용 가능하다. 

&&, ||, ==, !=, >, < 등 연산 기호를 사용할 수 있어서 다중 조건에 사용 가능하다.

#error

error 메세지를 출력한다.

어떤 장치를 장착할 지 알수 없는 초기 개발 단계에서 초기화 코드를 작성할 때 쓰인다고 한다.

#include <stdio.h> 

#define DEV1
#define MODE 3

#if defined DEV1 && MODE == 3
int main()
{
	printf("success!\n");
}
#elif !defined(DEV1)
#error no device
#else
#error incorrect mode
#endif

 

Header Guard

헤더 파일에서 중복으로 포함되는 것을 방지하기 위한 기법이다.

조건부 컴파일 전처리기 지시자로 헤더 파일이 중복으로 포함되는 것을 방지할 수 있다.

방법 1 - #pragma once

간단하고 사용하기 쉬운 장점이 있다.

사실 현재 대부분의 컴파일러가 지원한다.

하지만 방법 2에 비해서 잘 사용하지 않는다. 그 이유는

  • 방법 2인 #ifndef가 gcc 표준이다 (gcc ver3.4 이전 버전에서 지원 x)
  • 같은 파일이 여러 경로에 있을 경우에 컴파일러가 다른 파일로 인식해서 중복 포함

자바스크립트에서 ; 를 계속 포함하듯 gcc가 워낙 메이저하다보니 잘 사용이 안되는 것 같다.

#pragma once
// 헤더 파일 내용
#include <stdio.h>

void func1();

 

방법2 - #ifndef ~ #define ~ #endif

해당 이름의 매크로가 없을 경우 해당 이름의 매크로를 정의하고 헤더파일을 작성하는 방법이다.

해당 헤더 파일을 다시 부를 경우 해당 이름의 매크로가 있어서 생략되게 된다.

#ifndef HEADER_FILE_H
#define HEADER_FILE_H
// 헤더 파일 내용
#include <stdio.h>

void func1();
#endif // !

 

+ Recent posts