인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

조준수님의 프로필 이미지
조준수

작성한 질문수

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

9.11 헤더 파일 만드는 방법

헤더파일에 함수를 작성하지 않는이유

작성

·

2.4K

1

강의 내용을 보면 헤더파일엔 함수를 선언만하고 

함수의 정의는 다른 c파일에 정의를 하여

사용하는걸로 나오는데요.

굳이 c파일을 하나 더 만들지 않고 아예

헤더파일에 함수를 정의해서 사용해도

정상적으로 사용가능한데 이런 방식으로 사용하지 않는

이유를 알 수 있을까요?

답변 1

6

헤더 파일에 함수의 바디까지 전부 정의해놓았을 때 문제가 생기는 경우는 다음과 같습니다.

예를 들어 A.h 라는 헤더 파일에 Func 라는 함수의 바디까지 전부 다 정의를 해놓았다고 가정해보겠습니다.

그리고 B.h 라는 헤더 파일에서 이 Func 함수를 사용한다고 가정해보겠습니다. 그러면 B.h 에서 #include <A.h>  가 필요하겠죠?

이런 상태에서 우리가 사용하고자 하는 코드 파일인 main.c 에서 A.h 와 B.h 둘 다 사용해야 한다면 어떨까요? #include <A.h> 와 #include <B.h> 를 해주어야겠죠.

이렇게되면, B.h 에서도  #include <A.h> 를 해준 상태이기에 Func 함수의 바디가 B.h 에 정의가 되어있는거나 마찬가지고 (include 한다는건 그 헤더파일 코드를 그~대로 복사해 현재 코드 파일에 붙여넣기 한다는거니까요)

A.h 에도 Func 함수의 바디가 정의되어 있으니, main.cpp 에는 #include <A.h>  #include <B.h> 로 인하여 Func 함수의 바디가 두 번이나 정의되는 것이나 마찬가지이게 됩니다.즉, Func 함수 바디 코드 부분이 두 번 복붙 된거죠!

아시다시피 동일한 함수의 바디를 두 번 정의하는건 오류입니다.

위 같은 현상이 일어나지 않을거라는 전제가 되어있다면 헤더파일에 함수 바디까지 정의해도 문제가 없겠지만 프로그램 규모가 커지고 작성하는 헤더파일 종류가 많아지고 하면 헤더파일끼리 종속성을 띌 가능성이 높아지기 때문에 위와 같은 현상이 발생할 수 있습니다.

그렇기 떄문에 헤더파일엔 바디까지 전부 정의하기보단 프로토타입만 작성해두고  다른 c 파일에서 이 바디를 정의해두는 것입니다. c 파일은 include 되는 파일은 아니기 떄문에 여러곳에 복사가 될 필요는 없을뿐더러 프로토타입은 동일한 프로토타입이 여러개 존재해도 문제가 없거든요. 바디가 정의된건 아니기 때문에 메모리를 가지는, 실존해있는 상태는 아닌거라서..!

그리고 헤더파일엔 프로토타입만 모아두는게 가독성면에서도 훨씬 깔끔해보이기도 하구요. 

조준수님의 프로필 이미지
조준수

작성한 질문수

질문하기