개발 Study

#23. 전처리 명령어 (#define #if #ifdef 등)

HYuk 2021. 4. 29. 03:03
728x90

#define

#define은 매크로라고 하는데

단순 치환해주는 작업을 수행한다.

앞에 #을 붙여서 전처리 단계때 진행한다.

#define 매크로이름 치환할값 으로 작성된다.

1. 이때 마지막에 세미콜론(;)을 붙여버리면 그거까지 치환이 되므로 주의한다.

2. 치환할값을 비워두면 공백처리 된다.

#include <iostream>
#define		PI		3.14f

using namespace std;

void main()
{
	cout << PI << endl;
}

이와 같이 작성하면 3.14가 출력된다.

단순히 PI를 3.14로 치환 시켜준 것이다.

 

 

이때 define으로 매크로 함수도 수행할 수 있다.

#include <iostream>
#define Square(x) x*x

using namespace std;

void main()
{
	cout << Square(3) << endl;
}

Square 라는 함수를 #define 으로 처리한 것이다.

이때 주의할 점은 Square(x)라는 문구를 x*x로 치환한 것이기 때문에, Square(2+1) 이런식으로 사용하게 될 경우

2+1*2+1 이런식으로 계산되어 결과값이 5가 나오게 된다.

이럴 경우를 대비해 치환할 값에 (x)*(x) 이런식으로 우선순위를 해주어야 한다.

 

#define을 사용할 때, 한줄만 인식 되기 때문에 두줄이상 사용하고 싶을 경우,

역슬래시(\)를 맨뒤에 붙여주면 된다. (역슬래시 뒤에 공백도 있어선 안된다)

 

ex)

#define Square(x) \

x*x

 

매크로 함수는 기존 함수의 매개변수, 지역변수 할당 등의 작업이 필요하지 않기 때문에 짧고 자주쓰는 함수에서 유리하다.


#if

#elif

#else

#endif

위의 전처리명령어 네가지는 기존의 if문의 사용법과 같다.

hyukee.tistory.com/9?category=1191730

 

#7 if문 및 삼항연산자

1. if문 if문은 조건을 따져서 해당 조건에 맞으면 수행하고, 그렇지 않으면 수행 하지 않는 조건문이다. if(조건) { 수행 할 문구; } 이때 조건이 맞는다면 수행 할 문구가 수행되고 아니면 수행 되

hyukee.tistory.com

다만 여기서의 if는 전처리명령어로써, 조건을 따져보고 조건에 부합하지 않는다면, 컴파일하지 않는다.

 

#if 조건

수행문;

#endif

 

형식으로 사용하면 된다.

조건에 맞으면 #if와 #endif 사이의 수행문이 컴파일 되고

조건에 맞지 않으면 #if와 #endif 사이의 수행문이 컴파일되지 않는다.

#include <iostream>

using namespace std;

#define		A	3

void main()
{
#if A == 3
	cout << "A는 3이다" << endl;
	cout << "A는 3이다" << endl;
#endif
}


#ifdef

#endif

 

#ifndef

#endif

 

#ifdef 매크로이름

으로 쓰이는데 해당 매크로가 #define 되어있는경우, #endif부분까지 컴파일을 수행한다.

 

#ifndef는 반대로 #define 되지 않아있는경우, #endif부분까지 컴파일을 수행한다.

 


#ifndef는 보통 여러 헤더파일을 읽어올 때, 중복을 방지하기위해 쓰인다.

 

예를들어 A파일에서 #include "B"를하고, (표준이 아닌 파일의 경우<>가 아닌 ""로 include를 한다.)

B파일에서 #include "A"를 할 경우,

메인에서 두파일 모두 include 할 때, 중복으로 include 되거나, 무한으로 include안에 include 로 들어가게 될 수 있다.

#pragma once

또는

#ifndef

을 사용하여 중복으로 읽게 되는 것을 막아 안전하게 사용할 수 있다.

 

다만 #pragma once 는 비표준이고

#ifndef는 표준이므로

 

헤더파일에 #ifndef를 습관적으로 붙여주는것이 좋다.

 

 

 

-> .h를 헤더파일이라하고 .cpp를 소스파일이라고 하는데

헤더파일에는 함수의 선언부와 구조체 또는 열거체 등의 정의형태를 모아 놓는다.

소스파일에는 함수의 정의부를 모아 놓는다.

 

한 곳에 모든 코드를 사용하지 않고 헤더파일과 소스파일로 나눠서 쓸 경우 주의점

1. 헤더 파일에는 전역 변수를 선언할 수 없다.
2. 헤더 파일에는 함수의 정의부를 정의할 수 없다.

728x90