77.2 계산 데이터 헤더 파일 작성하기
먼저 계산 데이터 구조체가 들어갈 헤더 파일부터 만듭니다. 다음 내용을 프로젝트 디렉터리에 calcdata.h로 저장하세요(프로젝트에 헤더 파일을 추가하는 방법은 '76.3 파일 포함하기' 참조).
examplecalc/examplecalc/calcdata.h
#ifndef CALC_DATA_H // CALC_DATA_H가 정의되어 있지 않다면 #define CALC_DATA_H // CALC_DATA_H 매크로 정의 typedef struct _CALC_DATA { // 계산 데이터 구조체 정의 int operand1; // 계산할 값1 int operand2; // 계산할 값2 char operator; // 연산자 문자 int result; // 계산 결과 } CALC_DATA; #endif // #ifndef CALC_DATA_H 끝
계산 데이터 구조체 _CALC_DATA(구조체 별칭 CALC_DATA)에는 계산할 값 두 개와 연산자 문자 그리고 계산 결과가 멤버로 들어갑니다. 그런데 헤더 파일의 맨 위와 맨 아래에 조건부 컴파일 지시자가 들어있습니다.
C 언어의 헤더 파일은 여러 소스 파일에서 포함할 수 있습니다. 만약 calc.c와 print.c에서 calcdata.h 파일을 포함했다면 calc.c와 print.c 두 파일 모두 calcdata.h 파일의 내용이 들어가므로 CALC_DATA 구조체의 정의 부분도 두 개가 생깁니다. 하지만 같은 이름으로 된 구조체를 두 번 정의하면 컴파일 에러가 발생합니다.
이런 형태의 조건부 컴파일은 컴파일 에러를 방지하기 위해 사용합니다. 즉, 다음과 같이 CALC_DATA_H 매크로가 정의되어 있지 않다면 CALC_DATA_H 매크로를 정의하고, 코드를 포함합니다.
#ifndef CALC_DATA_H // CALC_DATA_H가 정의되어 있지 않다면 #define CALC_DATA_H // CALC_DATA_H 매크로 정의 // 코드를 포함(구조체 정의 부분) #endif
만약 다른 소스 파일에서 calcdata.h 헤더 파일을 포함하게 된다면 CALC_DATA_H 매크로가 이미 정의되어 있으므로 #ifndef와 #endif 사이의 코드는 포함하지 않게 됩니다.
#ifndef CALC_DATA_H // CALC_DATA_H가 정의되어 있으면 // 코드를 포함하지 않음 #endif CALC_DATA_H
이렇게 조건부 컴파일을 활용하면 구조체 정의 부분은 언제나 한 번만 포함되므로 컴파일 에러는 발생하지 않습니다.