인프런 커뮤니티 질문&답변

m1n_q님의 프로필 이미지
m1n_q

작성한 질문수

홍정모의 따라하며 배우는 C언어

16.12 라이브러리

header file과 include 질문드립니다!

작성

·

356

0

/*
        MyLibrary.c
*/

#include "MyLibrary.h"

#include <stdio.h>

void say_hello()
{
	printf("Hello\n");
}

void say_world()
{
	printf("World\n");
}



/*
        MyLibrary.h
*/

#pragma once


void say_hello();
void say_world();

 

위와 같은 강의 중 코드에서,

Q1. header file의 프로토타입? 과 c file의 몸체가 연결되는 것은 
        external linkage인 function의 특성때문이 아닌가요 !


Q2. 왜 c file에서 h file을 include 해주는지 잘 모르겠습니다!
        일단 include를 안해도 함수가 연결이 되는 것 같고...

         또 굳이 include를 한다면 뭔가 함수의 이름만 있는 header file에서 
         함수의 몸체가 있는 c file을 include 해야 맞는 것 같고...

          어떤 원리고, 이유인가요?

답변 3

1

아 제가 놓치고 있던 부분이 있었네요. static 안 붙인 일반 함수들은 전역함수이다 보니 같은 프로젝트 내의 c 파일들은 다 다른 c파일에서 정의된 함수를 알고 있는듯 하네요.

보통 선언부는 헤더파일에 모아두고 정의는 소스파일에서 하기를 권장하는데 같은 프로젝트 내의 c 소스파일들끼리 서로의 함수를 알고 있다면 뭐하러 헤더파일을 인클루딩할까 싶어 저도 문득 궁금해졌습니다. 

https://kldp.org/node/154523

찾아보니 이 링크의 답글들에서 자세히 설명을 해주시고 있네요. 

함수 선언부를 모아둔 헤더파일을 굳이 사용하지 않더라도 문제는 없지만 함수 선언부만 모아둔 헤더파일을 사용하면 유지보수 하기가 더 쉽기 때문에 권장을 하는 것 같아요. 사용할 함수들을 한눈에 볼 수 있기도 하구요. 링크 참고해보세요!

1

일단 include를 안해도 함수가 연결이 되는 것 같고... 👉 오 아닙니다..! include 안하면 몰라요!

c파일에서 인클루드하여 바디를 정의해주는 이유는 제가 바로 이전 질문글에 답변드린 것으로 답변이 될 것 같습니다. 

0

m1n_q님의 프로필 이미지
m1n_q
질문자

답변 감사드립니다.

이전 질문에서 말씀해주신 c와 h를 나누는 이유는 이해가 됐습니다.

음... 답변에서 c파일에서 include를 안하면 header파일에서 모른다고 하신 부분이

제가 테스트를 해봤을때는 왜 되는걸까요? ㅠㅠ

<test_header.c >

#include <stdio.h>
void test()

{        printf("didn't include\n"); }

<test_header.h >

void test();

위 두 파일로 lib을 만들고, 아예 다른 프로젝트에서 불러와보았습니다.

<TEST.C>

#include <stdio.h>

#include <test_header.h>

int main()

{        test(); 

         return 0;

}

했을때, 라이브러리의 c파일에서 header를 Include 하지 않았음에도 
test함수가 잘 실행이 되더라구요,,,,, 왜 그런 것일까요?

m1n_q님의 프로필 이미지
m1n_q

작성한 질문수

질문하기