구현파일이 자신의 헤더를 포함하는 이유

vani2의 이미지

main.cpp
test.cpp
test.hpp

이렇게 3개의 파일이 있습니다.

main.cpp과 test.cpp에는 #include "test.hpp" 전처리기 명령이 있는데요,

여기서 test.cpp에 test.hpp을 넣어주는 이유가 무엇인가요?

DarkSide의 이미지

test.cpp 에서 test.hpp를 포함하지 않으면 test.hpp 는 어디에도 포함되지 않게 되죠.
test.cpp 를 컴파일하는데 필요합니다.

그리고 게시판을 도배하고 계신데, 간단한 사항은 검색이나 책을 찾아보세요.

vani2의 이미지

아 죄송합니다.

한번에 답글을 모두 달아서 같은 시간대에 제 글이 뭉쳐 올라온 것일 겁니다.

shint의 이미지

1. 전처리기 명령
http://moople.tistory.com/5

2. main.cpp 에 #include "test.cpp" 로 코딩해서 테스트해 보세요.

3. 말씀 드리고 싶은 내용은. 파일 하나에 모두 코딩한다고 생각하시면 편합니다.
test.h printf("3");
test.cpp printf("2");
main.cpp printf("1");

#include "test2.h"
#include "test1.h" 는 코드가 만들어지는 위치 순서'로 생각하시면 편합니다.

4. Makefile을 보면 이런 내용이 있습니다.
$GCC = g++.exe
$WINDOW_RESOUCE = windres.exe
$INCLUDE = -l "C:\include"
$LIB = -l "C:\lib"
$FLAG = $INCLUDE -threads

main.cpp를 컴파일 하면 main.o 목적 파일이 생성 됩니다.
g++ -o main main.cpp -l "C:\include" -threads
$GCC -o main main.cpp $FLAG

test.cpp를 컴파일 하면 test.o 목적 파일이 생성 됩니다.
g++ -o test.o test.cpp -l "C:\include" -threads
g++ -o test.o test.cpp $FLAG

이것을 링크로 묶어주면. exe가 생성됩니다.
g++ main.o test.o -o "Project1.exe" -l "C:\lib"
$GCC main.o test.o -o "Project1.exe" $LIB

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

klyx의 이미지

'자신의 해더'라는 건 없습니다. include는 그냥 그 파일을 그 자리에 똑같이 복사해 넣은거랑 똑같은 효과를 가집니다.
중요한건 선언이 먼저 되어있어야 한다는 겁니다.

익명 사용자의 이미지

C와 C++은 (앞으로는 어떻게 될련지 모르지만)
각종 언어 중에서 가장 간단한 include 개념을 갖고 있습니다.
그냥 해당 위치에 파일 내용을 그대로 복사하는거죠.

심지어 한 파일에 중복해서 첨가하는걸 막아주는 기능도 없어서,
수동으로 매크로 가드를 쓰던가 pragma 지시자를 쓰던가... 해야되죠.

사실 굳이 따로 안만들고, 각 .c/.cpp 파일마다 복사해서 붙여넣어도 됩니다(!)

확장자 제한도 없습니다.
.h를 쓰는건 그냥 관례일 뿐이고,
위에서 말씀하신대로 .hpp를 쓰거나, 아예 확장자를 안쓰거나...

헤더 파일과 .c/.cpp 파일의 내용 구분도 상당히 자의적입니다.
그래서 알아서 프로그래머가 잘 선언과 정의를 구분해서 넣는 것이 중요합니다.
초보때는 이게 적지않게 부담이 되기도 하지요.

헤더 파일이 뭔가 특별한 파일이라고 생각하면, 그순간 이해가 산으로 가는 겁니다.
프로그래머가 자의적으로, 여러군데에 타이핑해야 할 동일한 선언들을
편의를 위해 모아놓은 파일이라고 보시면 됩니다.

vani2의 이미지

아. 그럼

그저 포함한다는 의미로 이해하면 되는군요.

감사합니다.

댓글 달기

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