C언어 파일분활과 헤더파일 헤더파일 중복 문제

    2018-02-11 01:10:00 작성

    구조체의 정의는 헤더파일에 삽입하는게 좋습니다.
    하지만 구조체정의는 중복해서 정의하면 안되기 때문에 헤더파일을 단 한번만 삽입해야합니다.
    다음 예제는 총 4개의 파일로 구성되어 있습니다.


    stdiv.h
    typedef struct _div {
    	int quotient; //몫
    	int remainder; //나머지
    } Div;

    몫과 나머지를 저장할 수있는 구조체 Div를 정의하였습니다.


    initdiv.c
    #include "stdiv.h" // Div 구조체 사용을 위해 포함
    
    Div initDiv(int num1, int num2) {
    	Div val;
    	val.quotient = num1 / num2;
    	val.remainder = num1 % num2;
    	return val;
    }

    initDiv 함수는 Div 자료형을 만들어 반환합니다.


    initdiv.h
    #include "stdiv.h" // Div 구조체 사용을 위해 포함
    
    Div initDiv(int num1, int num2);

    initdiv.c에서 정의한 함수의 원형을 선언한 헤더파일입니다.


    main.c
    #include <stdio.h>
    #include "stdiv.h"
    #include "initdiv.h"
    
    int main(void) {
    	Div val = initDiv(8, 3);
    	printf("몫 : %d\n", val.quotient);
    	printf("나머지 : %d\n", val.remainder);
    	return 0;
    }

    컴파일을 하면 다음과 같이 오류가 발생합니다.

    구조체가 중복 정의되어 오류가 발생한 상황입니다.

    main.c 파일에서 stdiv.h를 포함하고 inidiv.h를 포함하였습니다.
    initdiv.h에서도 stdiv.h를 포함하여 stdiv.h가 두번 포함되었습니다.
    Div 구조체가 두번 정의 되어 문제가 되는것 입니다.
    이것은 조건부 컴파일을 활용하여 중복 정의 되는것을 해결할 수 있습니다.


    중복 정의가 해결된 stdiv.h
    #ifndef __STDIV_H__
    #define __STDIV_H__
    
    typedef struct _div {
    	int quotient; //몫
    	int remainder; //나머지
    } Div;
    
    #endif

    위에처럼 #ifndef로 매크로가 정의 되었는지 확인한 후 정의 되지 않으면 컴파일을 합니다.
    두번째 줄에서 #define 으로 매크로를 정의합니다.
    이후에 중복 로드 될때에는 매크로가 이미 정의가 되어있으므로 컴파일하지 않습니다.
    이제 실행하면 오류없이 컴파일됩니다.

    이렇게 헤더파일을 선언할때에는 조건부 컴파일로 정의및 선언이 한번만 되게 해야 합니다.

    헤더파일 생성시 #pragma once라는 코드가 있는데 이것은 위의 조건부 컴파일처럼 파일을 한번만 포함하여 컴파일 하는 효과가 있습니다.
    이것은 표준 선행처리기가 아닌 visual studio에서만 사용가능한 선행처리기입니다.