개발 지식/C,C++

[C언어] 헤더파일과 전처리기

Prcnsi 2021. 6. 10. 23:46
728x90

안녕하세요! 여러분들 잘 지내셨나요?

저는 한동안 시험기간이여서 뜸했습니다. 그래서 1학기 동안 배운 것들을 

한 번 정리해보는 시간을 가질까 합니다. 

대략 6장 정도로 제가 이해한 것을 정리해서 업로드할 예정입니다.(C언어)

 


세 줄 요약

함수 선언: head.h

함수 정의: head.c

메인 파일: include "head.h"

 

위와 같이 메인파일에서 함수 선언부 파일은 include하면 함수 정의부도 같이 컴파일됨

함수정의는 헤더파일과 이름은 같고 확장자만 다르게 써줌

 

1.헤더파일

 

    1)헤더파일이란?

 

    자 헤더파일이 뭐냐면 확장자가 .h로 끝나는 파일을 말합니다.

    소스파일이 .c이고 텍스트 파일이 .txt인 것처럼 말이죠.

 

    외형적 특징은 위와 같고 의미는 함수의 선언부를 모아놓은 파일입니다.

 

    엥 이게 무슨소린가 싶을 수 있는데, 이게 무슨 소리냐면 지금 제가 짜는 파일처럼

    함수가 몇 개 없는 간단한 파일에서는 굳이 헤더파일의 필요성을 못 느낄 수 있지만

 

    산업용 프로그램같이 볼륨이 큰 프로그램에는 함수가 매우 많기 때문에 

    통장을 쪼개서 돈을 효율적으로 관리하듯이 소스파일을 용도에 맞게 쪼개서 더 효율적으로 관리할 수 있는 것입니다.

 

 

 

 

    2)사용 방법

 

      이는 간단하게 아래 구조와 같이 사용할 수 있습니다.

 

      <헤더파일.h>

    #ifndef _헤더파일명_
    #define _헤더파일명_

    함수 선언

    #endif

    (이때 파일명은 대문자로,마침표는 언더바_로 치환)

    ifndef는 if not define 이고 def는 아시다시피 define의 약자로 이를 합쳐 선언되어 있지 않다면

    아래와 같이 선언하라는 뜻입니다.

 

 

 

 

      <소스파일>

    include"파일명"
    (이때 파일명은 대문자 X)

    소스파일에서 함수를 선언한 헤더파일을 include하면 함수를 선언하지 않고도 바로 함수를

    사용할 수 있습니다.

 

    여기서 잠시 추가적으로 함수의 선언과 정의에 대해 마지막 부분에 정리해 놓았습니다.

 

    다시 본론으로 돌아가서 이 소스코드를 용도에 따라 나눠서 관리한다는 아이디어는 한 발자국

    더 나아가면 소스코드를 메인함수,함수 선언,함수 정의로 나눌 수도 있습니다.

 

   그렇지만 이번 포스팅에서는 함수 선언만 분리만 알아보겠습니다.

 

    그래서 아래 예제를 통해 위의 학습한 내용을 알아봅시다.

 

 

 

 

    먼저 소스파일과 헤더파일을 각각 하나씩 만들어 줍니다.

 

 

소스파일 헤더파일

    그런 다음 헤더파일로 가서 더하기 함수를 하나 선언해 줍니다.

함수 선언

    그리고 다시 메인함수로 가서 위 헤더파일을 include 한 후 

    함수를 선언하지 않고 사용해 보았습니다.

소스코드

    그리고 실행을 해 보았더니 아래와 같이 잘 출력이 됨을 확인할 수 있습니다.

 

결과창

    이를 통해 함수 선언만 모아둔 헤더파일을 만들어 소스파일에서 함수를 선언하지 않고도 사용할 수 있음을 

    알 수 있습니다.

 

 

 

 

 

 

2.전처리기

    1)전처리기

    :전처리기란 말 그대로 컴파일 직전에 전처리 하는 것으로 

    일반적으로 자주 사용되는 숫자 혹은 문자를 정하는데 사용됩니다.

    이 중에서도 배열의 크기를 전처리기로 사용하는 경우가 많습니다.

 

    그러니까 const 변수처럼 치환할 문자를 정하는 것 입니다.

   

    예를 들어 전처리기로 NUM 을 100으로 정의해 둔다면 컴파일 직전에 모든 소스파일의 NUM 자리에 

    100이 들어가게 됩니다. 

 

    이와 같이 전처리기는 미리 키워드를 정의하는 역할을 합니다.

    대표적인 전처리기로는 include 와 define 이 있습니다.

 

    2) include 사용법

     위 헤더파일 포함예제에서도 include를 사용하였고 일반적으로도 include<stdio.h>와 같이 

     include를 종종 사용하는데 이때 include하고 따옴표를("") 사용하는지 꺽새로(<>) 사용하는지는

     누가 만든 것을 포함시키느냐에 따라 다릅니다.

    

     만약 내장함수와 같이 제작자가 만든 것은 꺽새로 포함해주고

     사용자 내장 함수와 같이 개발자가 만든 것은 큰 따옴표로 포함시켜 주면 됩니다.

 

    3) define 사용법

    :전처리기의 사용법은 아래와 같습니다.

    

#define A B
(A -> B)

    로 코드 중 A를 B로 치환해줍니다.

    그러니까 A=B;와 같은 역할을 하는 것인데 위와 같이 전처리해주는 이유는

    값을 바꾸지 않고 중복을 피하기 위해서 입니다.

    

    이는 아래 예제로 간단하게 확인해 볼 수 있습니다.

전처리기

    위의 코드에서 컴파일러는 NUM이라는 문자를 100으로 바꿔주고 a라는 문자는 3이라는 숫자로 바꾸어 줍니다.

    따라서 코드의 결과는 아래와 같이 3과 hello가 출력됩니다.

    

    (참고로 배열 b에서 배열의 크기를 1 더해서 정의한 이유는 마지막 널 값이 들어갈 자리를 더해주는 것 입니다.)

 

define결과

 

 

 

 

 

 

 

 

+함수 사용 방법

1.선언-호출-정의
2.정의-호출

선언이란 int avg(int a, int b); 와 같이 함수를 선언하고 세미콜론을 붙여서 원형만 한 줄로 작성한 것이고

정의란 int avg(int a, int b){ 내용 } 과 같이 함수의 동작까지 서술해서 중괄호로 끝나는 것입니다.

 

이해 가시나요? 

 

일단 기본적으로 c언어는 위에서 아래로 향하는 절차적 언어이기 때문에 함수를 정의하거나 선언하지도 않고

아래와 같이 사용할 수는 없습니다.

 

호출-선언-정의(X)
호출-정의(X)

 

그런데 함수를 선언해서 있다고 알려주면 아래에 정의하기 전에 사용할 수 있습니다.

그러니까 컴파일러한테 함수가 밑에 있다고 알려주는 것이지요.

그것이 첫 번째 함수 사용 방법이고

 

두 번째 사용 방법은 정의하고 호출하는 것입니다. 여기서는 함수를 선언할 필요가 없는데요.

함수 정의에 함수 선언이 포함되어 있기 때문이죠

선언∈정의

따라서 결론적으로 위와 같이 두 가지 방법으로 함수를 사용할 수 있습니다!

 

 

 


 

이번 포스팅에서는 헤더파일에 관해 알아 봤습니다.

내일은 배열에 관한 포스팅을 업로드 하겠습니다.

봐주셔서 감사합니다!

728x90