#23. 전처리 명령어 (#define #if #ifdef 등)
#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. 헤더 파일에는 함수의 정의부를 정의할 수 없다.