헤더파일은 왜 만드나요??

thslrtoo의 이미지

아주 초보적인 질문입니다.
C나 C++을 보면 헤더파일이 따로 존재하는데요.
헤더파일은 왜 만드나요??
보통 헤더파일에는 C같은 경우에는 함수 원형이나 사용할 변수들이 선언되어 있고,
C++같은 경우에도 클래스 선언이나 전역변수등 C와 다를바 없습니다.
이런것들은 .c나 .cpp 파일에서도 선언할 수 도 있지않나요??
그리고 #include 할때 .h 파일 말고 .c나 .cpp 파일로 해도 되던데
왜 굳이 헤더파일을 따로 만드나요??
단순이 보기편하라고, 혹은 관리하기 편하라고 그렇게 하는건가요??

pchero의 이미지

헤더파일을 만드는 이유에 대해 먼저 말씀 드리겠습니다.

.cpp 파일로 만들어진 오브젝트 파일에 있는 함수들의 내용을 다른 소스 파일에서 사용할 수 있도록 하기 위함입니다.

A.cpp 파일에서 B.cpp 파일에 들어있는 함수나 클래스를 사용하기 위해서는 함수의 프로토 타입이나 클래스 선언 등의 정보가 필요합니다.
(그래야 어떤 함수(또는 메소드)를 호출할때 인자값이 필요하고, 안필요하고와 리턴 타입을 알 수 있으니까요.)

그런 정보들을 파악하기 위해서 헤더 파일을 만들어서 관리합니다.

그리고, 헤더파일의 사용에 대해서 질문하셨는데.. 이는 라이브러리를 생각하시면 간단합니다.
라이브러리와 같은 것들은 cpp 파일을 제공하지 않는 경우가 많기 때문입니다.

그리고, 무엇보다 관리와 공유가 편하다는 장점이 있습니다. :)

---------------------------------
제일 왼쪽이 저입니다 :)

lmk378의 이미지

예전에 제가 궁금했던 질문이군요^^
http://kldp.org/node/120882

emptynote의 이미지

제가 잘못 알고 있을수도 있습니다. 주 언어가 자바라서요.

구현과 선언을 분리하기 위해서

선언 부분을 헤더 파일로 따로 분리한것으로 알고 있습니다.

선언의 용도는 "김성태" 님께서 잘 설명해 주신듯합니다.

아래 3가지를 통해서 실행파일로 만들어 져서 운영체제에서 동작하는 모양새까지 알아야
제대로된 헤더 파일을 작성할 수 있다고 가르침을 받았던 적이 있는데,
아직도 왕초짜라 그게 맞는 말인지 그른말인지 모르겠습니다. ^^;

(1) 전처리기
참고 주소 : http://weezzle.net/1664

c 언어라면 전처리기를 먼저 돌려 보신후 소스를 보시기를 바랍니다.
(2) 컴파일러
(3) 링크

klyx의 이미지

선언부가 있어야 다른 곳에서도 이용가능하다는 것은 질문자께서도 알고계신듯합니다.
그보다 질문의요지는 그 선언이란 것을 정의와 분리하는 이유가 뭔지를 물어보신것 같은데, C/C++에서 선언은 중복되어도 괜찮 지만 정의는 중복되어선안되기 때문입니다.
인클루드문은 해당파일을 그대로 때려밖는것이기때문에 한파일에 선언과 정의가 같이들어있가면 인클루드할때마다 같은 이름의 심볼(함수명, 변수명)이 중복정의됩니다.
심볼이 중복되면 결국 링크단계에서 올바른심볼을 찾을수없게되고 빌드에 실패합니다.
컴파일단계에 비유하자면 같은 스코프에 같은이름의 변수가 여러개 들어있는셈이됩니다.
그렇기때문에 선언만따로모아서 해더파일로 외부에 공개시키는 것입니다.

익명 사용자의 이미지

c파일을 인클루드해도 되던데 왜 따로 h파일을 만들어서 인클루드하냐는 의문인거 같습니다.

static과 extern이라는 키워드가 있습니다.
한번 책 꺼내서 관련부분(linkage)을 읽어보세요.

그 기능이 h파일이 아니라 c파일을 바로 인클루드하면 아무 효과가 없어집니다.
c파일이 그냥 하나로 합쳐져서 내부 외부 구분이 없어지니까요.

ymir의 이미지

external-linkage 를 갖는 애들을 무조건 include 하면, 서로 다른 object 내에서 동일한 symbol 들이 중복되기 때문에..
빌드할 때 linker 가 못해먹겠다고 투덜댈겁니다.

사실 implementation 이 internal-linkage 를 갖는다면, .c 든 .h 든 아무데나 놓고 include 해도 됩니다.
단, 중복 include 가 되지 않도록 미리 조치는 해둬야겠죠.
근데 이런식으로 하면, 서로 다른 object 에 동일한 코드들이 삽입되기 때문에, 코드 크기가 커지고 메모리가 낭비됩니다.

그래서 하나의 source file 에 이런 implementation 을 모아서 하나의 object 나 library 로 생성하고..
여기에서 export 된 symbol 들이나, 각종 data structure 등을 하나의 header 파일로 묶어서..
빌드할 때에는 이 header file 을 참조하는 형태로 사용합니다.

declarations 와 definitions 를 분리하라는 이유가 뭐 이런 것들 때문이죠.
근데 이렇게 분리하기는 했는데, 확장자가 모두 똑같다면..?? 대략 난감할겁니다. 그래서 확장자를 달리 씁니다.

static inline function 같은 경우는 굳이 분리하지 않고 header 에 넣어 쓰기도 합니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

qiiiiiiiip의 이미지


헤더는 어떤 것을 넣는다를 미리 배우지 않고..
되도록이면 모든 것을 .c에 넣어서 코딩하는 것이 좋을 수도 있을 것 같네요.

경력이 쌓이면, 언젠가는 헤더가 필요한 날이 올 수 밖에 없게 될테고..
그때가 되면 꼭 필요한 정보만 헤더에 넣게 되는 습관을 가질 수 있을 것 같습니다..

그런거 없이 선언은 헤더에 한다. 매크로는 헤더에 넣는다..
이렇게 외워서 코딩하면 오히려 안 좋을 듯..

예를 들어 local하게 쓰이는 macro를 global하게 include되는 헤더에 넣는다거나,
static하게 쓰일 함수들을 모두 헤더에서 선언한다거나 해서
나중에 분석하기 어렵게 만드는 그런 경우도 있어서요..

나그네나그네의 이미지

.c를 include하면 라이브러리가 목적파일 안에 다 들어가기 때문에 컴파일타임이 엄청나게 늘어납니다

header만 include하면 컴파일타임이 비약적으로 줄어듭니다

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.