컴파일시 헤더 파일 포함에 대해

hugeval의 이미지


만약 A라는 클래스가 있는 소스파일과

B라는 클래스가 있는 소스파일 둘다

abc.h 라는 같은 헤더파일을 포함시키고

중복되지 않게 #pragma once를 썼다고 할때

컴파일 하고 생성된 a.obj파일과 b.obj파일에는

둘다 abc.h 코드를 포함하여 생성된 상태인가요?

아니면 abc.obj파일에 참조할 권한같은걸 갖는건가요?

obj파일의 용량을 비교하면 포함할때와 안할때 차이가 없는것같거든여

그래서 링크되고나서 프로그램이 실행될때

참조할 권한같은 것을 갖는게 아닌가 해서요..

그리고 또한가지 질문 드리자면

abc.h를 포함 시키려고 할때

클래스가 선언된 *.h 파일과

클래스 몸체가 정의된 *.cpp 파일에서

abc.h를 *.h 파일에 포함시키는것과

*.cpp파일에 포함시키는 것과의 차이가 있는건가요?

좀 애매한것같아서 질문 올립니다

고수분들의 답변을 부탁드리겠습니다

moonhalo의 이미지

EXE 파일이 만들어지는 과정은 아래와 같습니다.

[소스 코드 파일]-(컴파일)->[Obj 파일]-(링크)->[exe 파일]

컴파일 단계에서 만들어진 obj 파일은 외부 개체(변수나 함수등)에 대해
있구나~ 정도만 알지 어떤건지는 알지 못합니다.

예를 들어 extern int GetID(); 를 cpp 위에 선언하고 호출해도 컴파일시에는 문제가 없지만,
저 함수의 내용이 뭔지는 모릅니다.
obj 파일안에 저 함수는 어딘가 있을 테니 그걸 호출해야 한다는 정보만 들어 있지요.

이 작업을 하는 것이 두번째 link 단계 입니다.
여기서는 이런 외부 개체에 대해 얘가 뭔지 알려주고 연결시키죠.

이렇게 보면, 첫번째 질문은 권한이라기 보다는 "외부 개체를 사용한다는 정보가 있다" 정도가 되겠네요.

두번째 질문은 차이점이 있을 수도 있고, 없을 수도 있습니다.
어떤 클래스가 정의된 a.h 와 a.cpp 가 있을 때,
a.h 를 다른 파일에서include 하지 않으면, b.h를 a.h에 넣으나 a.cpp 에 넣으나 차이는 없습니다.

하지만, b.h 를 a.h에 include 했을 때, 다른 파일에서 a.h를 include 하면
그 파일들도 모두 b.h 도 include 하게 됩니다. a.cpp 에 넣는다면 그렇지 않겠죠.

프로젝트가 커질수록 컴파일 시간에 대한 부담이 커지는데,
그래서 .h 에는 include 를 하지 않으려고 하거나 precomlied header를 쓰게 됩니다.

hugeval의 이미지

감사합니다~^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.