프로그래밍/C, C++

C #include 지시문과 헤더 파일, 인클루드 가드

argentdarae 2025. 4. 8. 23:02
반응형

C 언어에서 #include 지시문은 다른 파일의 내용을 현재 소스 파일에 포함할 때 사용된다

전처리 과정에서 다른 파일의 내용을 현재 소스 파일에 포함하는 것이다

 

#include 지시문을 사용할 때, 두 가지 방식이 있다

  • <파일명> 형식은 표준 라이브러리를 포함할 때 사용되며, 컴파일러가 지정한 시스템 디렉토리에서 해당 파일을 검색한다
  • "파일명" 형식은 사용자 정의 헤더 파일을 포함할 때 사용되며, 현재 디렉토리에서 먼저 파일을 찾은 후, 시스템 디렉토리에서 검색한다
/* #include를 사용하여 헤더 파일을 포함한 코드 */

========= math_functions.h =========

#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H

/* 전역 함수 선언 */
int add(int a, int b);
int subtract(int a, int b);

#endif /* MATH_FUNCTIONS_H */


========= math_functions.c =========

#include "math_functions.h"

/* 두 정수를 더하는 전역 함수 */
int add(int a, int b) 
{
    return a + b;
}

/* 두 정수를 빼는 전역 함수 */
int subtract(int a, int b) 
{
    return a - b;
}


========= main.c =========

#include <stdio.h>
#include "math_functions.h"

int main(void) 
{
    /* 전역 함수 호출 */
    int sum = add(5, 3);
    int difference = subtract(10, 4);

    printf("Sum: %d\n", sum);
    printf("Difference: %d\n", difference);

    return 0;
}


========= 실행 결과 =========
Sum: 8
Difference: 6

 

위와 같이 #include 지시문을 사용하면 여러 파일에서 공통된 선언을 공유할 수 있다

컴파일 과정에서 전처리기가 #include를 처리한 후, 확장된 소스 파일은 컴파일되고, 링커는 여러 오브젝트 파일을 결합해 실행 파일을 생성한다

 

이를 통해 코드의 모듈화가 가능해지고, 유지보수성과 재사용성이 향상된다

 

인클루드 가드 (include guard)

C에서는 같은 헤더 파일이 여러 번 포함될 경우 중복 정의 오류가 발생할 수 있다. 이를 방지하기 위해 인클루드 가드를 사용한다

========= example.h =========

/* #ifndef EXAMPLE_H → 처음 포함될 때만 컴파일되며, 이후 중복 포함 방지 */
#ifndef EXAMPLE_H
#define EXAMPLE_H

/* 헤더 파일의 내용 */
void hello(void);

#endif /* EXAMPLE_H */

 

만약 인클루드 가드를 사용하지 않으면 다음과 같은 오류가 발생할 수 있다

/* 예제 코드 */

========= example.h =========

/* 인클루드 가드를 사용하지 않음 */
#include <stdio.h>

/* hello 함수 정의 포함 */
void hello(void) 
{
    printf("Hello, World!\n");
}


========= example1.h =========

#include "example.h"


========= example2.h =========

#include "example.h"


========= main.c =========

#include <stdio.h>
#include "example1.h"
#include "example2.h"

void hello(void) 
{
    printf("Hello, World!\n");
}

int main(void) 
{
    hello();
    return 0;
}

 

에러 발생


C 에서는 동일한 함수가 여러 번 정의될 수 없으므로 컴파일러가 중복 정의 오류를 출력하는 것이다

 


Reference

Source file inclusion - cppreference.com