Programming Language/C,C++

C,C++] 조건 컴파일 문

TwinParadox 2017. 7. 6. 12:00
728x90


 

 

헤더 파일을 작성하고 이용할 때 주의해야하는 부분이 있다. 클래스나 함수가 선언된 헤더 파일을 여러 차례 include 하면, 중복 선언으로 인해서 컴파일 오류가 발생할 수 있다는 점이다.

 

헤더파일을 이용하는 main.cpp에서 A라는 헤더 파일을 여러 차례 include하는 경우는 극히 드물겠지만, 문제는 다른 헤더 파일 BC에서 이미 헤더 파일 A를 내부적으로 include한 경우 일일이 헤더파일을 확인하는 방법 외에는 중복 선언을 방지할 방법이 없다. 제대로 숙지하지 못한 상태에서, A, B, C를 연달아 include하는 경우, 결국 헤더 파일 A의 중복 선언이 두 차례 발생해 컴파일 오류를 발생시킬 것이다.

 

이 문제를 해결해주는 것이 바로 조건 컴파일 문이라는 것이다.

 

헤더 파일을 작성하는 예제들을 보면 #ifndef#endif라는 그동안 보지 못했던 전처리 구문을 보게 되는데, 이것이 바로 헤더 파일의 중복을 해소해주는 조건 컴파일 문으로, 아래 예시를 통해 어떻게 동작하는지 알아보도록 하자.

 



main.cpp

#include <iostream>
#include "Adder.h"
#include "Calculator.h"
using namespace std;
int main()
{
	Calculator calc;
	calc.Run();
}



Adder.h

#ifndef ADDER_H
#define ADDER_H
class Adder
{
	int op1, op2;
public:
	Adder(int a, int b);
	int Process();
};
#endif



Adder.cpp

#include "Adder.h"
Adder::Adder(int a, int b)
{
	op1 = a;
	op2 = b;
}
int Adder::Process()
{
	return op1 + op2;
}



Calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H
class Calculator
{
public:
	void Run();
};
#endif



Calculator.cpp

#include <iostream>
#include "Calculator.h"
#include "Adder.h“
using namespace std;
void Calculator::Run()
{
	cout << "두 개의 수를 입력하시오 : ";
	int a, b;
	cin >> a >> b;
	Adder adder(a, b);
	cout << adder.Process() << endl;
}

 

 

여기서 main.cpp의 전처리문을 살펴볼 필요가 있다. iostreamAdder.hCalculator.hinclude했는데, 겉보기에는 사용하는 코드들을 전부 다 사용하기 위해서 include했기 때문에 문제가 없어 보이지만, 조건 컴파일 문이 존재하지 않았다면 컴파일 에러로 프로그램 실행이 불가능했을 것이다이유는 바로 Calculator.cpp에서 iostream, Adder.h에서 또 다시 include해주면서 중복 선언 문제가 발생하기 때문이다

 

최초 헤더 파일에서는 #define을 통해서 상수가 정의되고, 이후 동일하게 정의된 헤더파일을 include하는 경우에는 조건 컴파일 문의 값이 false가 되어 #endif문으로 빠져나오기 때문에 동일한 내용이 main.cpp에 확장되지 않게 된다.

 

이때 조건 컴파일문의 상수는 되도록 다른 조건 컴파일 상수와는 충돌하지 않게 하기 위해서 클래스 이름 혹은 헤더 파일의 이름으로 해주는 것이 좋다. iostream의 경우 _IOSTREAM_으로 정의되어 있고, 여기서는 ADDER_H, CALCULATOR_H로 정의되어 있다.

728x90