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.cprint.c에서 calcdata.h 파일을 포함했다면 calc.cprint.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

이렇게 조건부 컴파일을 활용하면 구조체 정의 부분은 언제나 한 번만 포함되므로 컴파일 에러는 발생하지 않습니다.