안녕하십니까. 김동우입니다.
이번 글에서는 전처리기에 대한 얘기를 해볼까 합니다.
전처리기가 어떤 것인지는 이전 글에서 말을 했었으나, 본문 이전에 간단하게 짚고 넘어가보겠습니다.
전처리기는 컴파일러에게 컴파일 이전에 실행될 어떠한 것들을 이야기해주는 것입니다.
주로 우리가 사용하는 #include, #define, #ifndef 등과 같은 것들을 의미합니다.
이러한 전처리기는 우리의 코드 내에서 다양한 역할을 하고 있습니다.
include의 경우 헤더나 파일을 불러오고, define은 매크로, 치환을 담당합니다.
ifndef의 경우 정의의 유무를 판단하고, 링크 에러를 방지해주는 기특한 녀석입니다.
다양한 전처리기는 대부분의 컴파일 과정에 필수적으로 자리잡고 있으니, 우리도 이에 대해 공부를 해야 합니다.
자, 코드를 봅시다
#include <iostream>
#include <algorithm>
using namespace std;
#define MY_NUMBER 333 // 1
// 매크로라고 부릅니다. 이후 MY_NUMBER가 등장할 경우 333으로 치환해줍니다.
// #define 이후에 작성될 이름들은 모두 대문자로 작성합니다.
// 숫자 뿐 아니라, 문자열로도 변경할 수 있습니다.
// 이를 문서편집기라고 부르기도 합니다.
#define MAX(a, b) (((a) > (b)) ? (a) : (b)) // 2
// 요즘은 매크로로 하드코딩하는 경우가 별로 없습니다.
// 그래도 알고는 있어야 합니다.
// 각 변수들에 괄호를 넣어주는 이유는 a나 b 자리에 상수가 아닌 수식이
// 들어갈 수 있기 때문입니다.
#define LIKE_APPLE
// LIKE_APPLE 뒤 값이 없는 이유는 이후 전처리기 라인 안에서는
// 치환의 작용을 하는 것이 아니기 때문입니다.
void doSomething(); // Orange.cpp 내에 body가 있습니다.
int main()
{
cout << MY_NUMBER << "\n" << endl; // 1
cout << MAX(1 + 4, 2) << endl; // 2
// 이러한 경우 때문에 선언 시 각 변수를 모두 괄호로 감싸줍니다.
cout << std::max(1 + 4, 2) << "\n" << endl;
// 위 MAX와 동일한 내장함수입니다.
#ifdef LIKE_APPLE
// LIKE_APPLE 매크로가 존재한다면,
cout << "Apple" << endl;
// 출력
#endif
// 일종의 조건문이 됩니다.
#ifndef LIKE_APPLE
cout << "not define Apple" << endl;
#endif
// LIKE_APPLE이 존재해서 VS에서 회색처리가 됩니다.
// ifdef, ifndef는 그래픽카드 사양, OS 분류에 사용됩니다.
// 이유는 이 모든 전처리기가 빌드 전에 구분되는 것이기 때문입니다.
#ifdef LIKE_APPLE
cout << "Apple" << "\n" << endl;
#else LIKE_APPLE
cout << "not define Apple" << "\n" << endl;
#endif
// 이런 식으로 작성해도 됩니다. (위 전처리기문과 같은 기능)
#define LIKE_ORANGE
doSomething(); // output : not define Orange
/*
peek definition - doSomething(in Orange.cpp)
#include <iostream>
void doSomething() {
using namespace std;
// 사용하는 함수의 body 내에 있는 것이 좋습니다.
#ifdef LIKE_ORANGE
cout << "Orange" << "\n" << endl;
#else LIKE_ORANGE
cout << "not define Orange" << "\n" << endl;
#endif
}
*/
// output의 이유는 doSomgething 함수의 정의가 있는
// Orange.cpp 파일 내에 LIKE_ORANGE가 #define 되어 있지 않기 때문입니다.
// 즉, 현재 파일에서는 함수 원본의 전처리기문을 적용받지 않습니다.
// 전처리기문의 적용범위에 대해 감이 오시겠죠?
return 0;
}
생각보다 주석이 많습니다.
이번 글은 개념보다는 실습 코드에 조금 더 포커스를 맞추었는데요, 나쁘지 않은 것 같습니다.
실제로 돌려보면 실행화면이 흥미롭습니다. 그러니 직접 한 번 돌려보시길 추천드려요.
자, 이번 글은 여기서 마치겠습니다.
그리고 이후 글은 따배씨++ (2.xx) 로 번호가 들어갈텐데, 이는 강의를 분리하기 위함입니다.
그럼 다음에 만납시다.