C언어 헤더 사용하기

이 포스트에서는 C언어에서 헤더를 사용하는 방법에 대해서 포스팅합니다.

일단, 다음 코드를 봅시다.

#include <stdio.h>

int sum(int a, int b)
{
    return a + b;
}

int main()
{
    printf("1 + 2 = %d\n", sum(1, 2) );
    return 0;
}

함수를 정의하고 출력에 사용한 간단한 예입니다. 실제로 이와 같이 선언하는 함수는 메인 함수보다 앞에 와야 합니다. 하지만 그렇다고 해서 메인 함수를 소스의 맨 마지막에 놓아야 한다는 것은 불합리한 일일 수 있습니다. 그래서,

#include <stdio.h>

int sum(int a, int b);

int main()
{
    printf("1 + 2 = %d\n", sum(1, 2) );
    return 0;
}

int sum(int a, int b)
{
    return a + b;
}

앞의 코드를 위와 같이 바꿔서 쓸 수도 있습니다. 사용자정의 함수를 앞쪽에다가 선언만 해 놓고 바로 다음에 메인 함수를 정의한 다음, 그 뒤에다가 미리 선언만 해 놓은 함수와 같은 함수를 정의합니다.

하지만 이 방식도 문제점이 있습니다. 이 예제는 전처리문이 표준 입출력 라이브러리(stdio.h)를 포함하는 것 한 줄 뿐이고 사용자정의 함수도 하나 뿐이니 별 문제가 안 되지만, 실제 프로그래밍에서는 이보다 더 많은 라이브러리를 사용해야 하고 미리 선언해야 할 함수도 많아지고 하면 코드 윗부분이 전처리문과 미리 선언된 함수 등으로 도배되어 불편을 야기할 수 있습니다.

그래서 별도의 사용자정의 헤더 파일을 만들어서 맨 앞부분에 전처리문과 선언함수 등을 넣을 수 있습니다. 아래 코드의 파일명이 각각 main.c와 main.h라고 가정하면,

// main.c
#include "main.h"

int main()
{
    printf("1 + 2 = %d\n", sum(1, 2) );
    return 0;
}

int sum(int a, int b)
{
    return a + b;
}
// main.h
#include <stdio.h>

int sum(int a, int b);

이와 같이 먼저 선언해야 할 부분들을 별도의 헤더로 옮겨놓을 수 있습니다.

또한, 실제 프로그래밍에서는 정의해야 할 함수가 많은데 이를 하나의 소스 파일에 담아두게 되면 소스 파일이 비대해지고 유지보수에도 어려움이 생기게 됩니다. 그래서 함수들을 별도의 소스 파일로 만들어서 해당 파일에 정의하게 되는데, 이 때도 그 소스 파일과 같은 이름의 헤더 파일을 만들어서 사용합니다. (반드시 소스 파일 이름과 헤더 파일 이름이 같아야 하는 법은 아니지만, 대개 편의를 위해 그렇게 합니다.) 예를 들어, main.c 파일과 sub.c 파일로 나누었다고 가정했을 때,

// main.c
#include "main.h"
#include "sub.h"

int main()
{
    printf("1 + 2 = %d\n", sum(1, 2) );
    return 0;
}
// main.h
#include <stdio.h>
// sub.c
int sum(int a, int b)
{
    return a + b;
}
// sub.h
int sum(int a, int b);

위와 같이 파일을 나눠서 쓸 수 있습니다. 다만, 이런 경우 빌드할 때 해당 소스 파일들을 모두 한꺼번에 빌드 대상으로 해야 합니다. 그러니까 이 예시에서는 main.c 파일만 빌드하면 빌드에러가 발생하므로 sub.c 파일도 동시에 빌드해야 합니다.

위와 같이 여러 개의 소스 파일을 사용할 때 함수들을 기능별로 분류해서 정의하는 것이 좋습니다. 나중에 다른 프로그램에서 필요로 할 때 라이브러리로 사용할 수 있다는 이점을 발휘할 수 있게 되기 때문입니다.

답글 남기기

이메일 주소는 공개되지 않습니다.