• 1.10.1 전처리기 include & define
  • 1.10.2 전처리기 ifdef & endif

1.10.1 전처리기 include & define


전처리기 중에 가장 익숙한 전처리기가 아닐까 싶다.

#include 전처리기를 사용하면 프로그램에 필요한 라이브러리를 끌어다가 쓸 수 있다. 가장 처음 쓰게 되는 라이브러리는 아마도 #include <iostream>인 것 같다.

#include <iostream> 
using namespace std; 
#define MY_NUMBER 333 
#define MAX(a, b) (((a)>(b)) ? (a) : (b)) 
#include <algorithm> 
#define LIKE_APPLE


#define을 통해 코드를 좀더 깔끔하게 작성할 수 있다. 매크로(marco)라는 명칭으로도 부르는 이 전처리기는 코드 내에 해당 매크로가 존재하는 경우 정의한 데이터로 컴파일 단계에서 교체를 해준다. 이를 통해 과거에는 많은 사람들이 max 함수를 만들어서 쓰곤 했는데, 지나친 괄호를 작성해야 올바르게 동작하기 떄문에 요즘에는 쓰질 않는다. 처음에는 공부하는 차원에서 해볼 수 있지만 max 함수 자체는 algorithm 라이브러리에 존재하니 끌어다가 쓰면 되겠다.

#define을 통해 교체하는 작업을 하지 않는 경우가 있는데, 바로 데이터를 작성하지 않고서 #define NAME만으로 작성된 매크로이다. 이전에도 사용하긴 했지만 #ifdef를 활용하여 코드를 작성할 때 사용하게 된다. 또한 해당 매크로는 작성된 파일 내에서만 영향력을 가지며, 그 영역을 벗어나서 동작하는 함수가 있다면 매크로가 없는 것으로 간주되니 주의하자. 이 부분은 뒤에 예시로 한번 보도록 하겠다!

참고로 매크로는 항상 대문자로만 구성해야하는 프로그래머의 관습이 존재한다.


1.10.2 전처리기 ifdef & endif

// 다른 코드에 정의되어 있는 함수 
void doSomething();


int main()
{
	cout << MY_NUMBER << endl; cout << std::max(1, 2) << endl;
#ifdef LIKE_APPLE 
	cout << "Apple " << endl; 
#endif 

#ifndef LIKE_APPLE 
	cout << "Orange " << endl; 
#endif 

#ifdef LIKE_APPLE 
	cout << "Apple " << endl; 
#else 
	cout << "Orange " << endl; 
#endif 
	
	doSomething(); 

	return 0;
}


먼저 작성된 코드와 함께 붙여서 쓰면 되는 코드이다. #ifdef LIKE_APPLE는 LIKE_APPLE이 정의되어 있다면 #endif까지 동작하게 해주는 전처리기이다. #ifndef는 반대로 정의되어 있지 않은 경우에 동작하게 된다. 위처럼 ifdef와 ifndef로 분할해서 만들수도 있지만, ifdef와 else를 활용하여 작성할 수도 있다. 둘 다 똑같이 작동하게 될 것이다.

앞에서 LIKE_APPLE을 정의했으니 Apple이 출력되도록 코드가 작동할 것이다. 실제 화면을 보면 Orange 파트의 코드는 희미하게 표기가 된다.

LIKE_APPLE이 정의된 경우

doSomething 함수는 다음과 같다.

doSomething

다른 파일에 작성된 함수이고 전방 선언을 통해 가져오도록 한다. 여기서는 Orange가 출력 될 것으로 보이는데, 앞의 코드들을 합치면 이미 LIKE_APPLE이 정의되어 있으니 doSomething도 Apple을 출력해야 할 것 같다는 생각이 든다.

result

실제 결과를 보면 doSomething에 의해 Orange가 출력되었다. doSomething 함수를 호출하는 곳에는 LIKE_APPLE이 정의되어 있어서 Apple을 출력시켰지만 doSomething 함수를 실행하기 위해 건너가는 파일에는 정의가 되어 있지 않아서 Orange가 출력된다. 이처럼 매크로의 정의는 해당 파일에만 한정되어 있으니 주의해야하며, 만약 Apple을 출력시키고 싶다면 해당 매크로를 또 작성하거나 매크로가 작성된 파일을 include로 끌어오면 되겠다.

+ Recent posts