c++ 소스파일에서 cpp, h파일 질문입니다.

leehs159의 이미지

클래스를 사용한건 아니고 간단한 실행 cpp파일들을 만들고있었는데
tool.h 라는 파일을 만들어서 그 안에 각종 .cpp파일들을 명시적으로 선언해 놓고 main()파일에서 호출해서 사용하는 방식으로 해왔었습니다.

그런데 의문점이 드는게 저는 cpp파일에서 [#include "tool.h"] 를 하지 않았는데도 tool.h파일에서 오류가 생성되지 않더군요 혹시 이유가 있을까요??

프로젝트안에 소스파일에 cpp파일 main파일 tool.h파일을 같이 생성해서 사용하고 있습니다.

예시
1.cpp 파일

#include
using namespace std;

void dd() {
cout << "cpp" << endl;
}
----------------------
tool.h 파일

void dd();
void ...
.
.
. /* 다른 .cpp 파일들*/
------------------------

main.cpp 파일

#include
#incldue "tool.h" /*tool.h를 인클루드해서 필요한 cpp파일을 불러서 실행*/
using namespace std;

int main() {
dd();
}

위의 3파일들은 프로젝트의 소스 파일에 같이 보관하고 있습니다.
다시한번 말하면 궁금한건 1.cpp에서 tool.h를 인클루드하지 않았는데 main에서 tool을 인클루드 한다고 해서 main.h -> tool.h --(cpp가 include를안함)-> 1.cpp -> 실행후 main함수로 값 전달에서 .h->.cpp파일로의 이동이 가능한가요?

클래스는 반드시 헤더파일을 인클루드 해야하는데 혹시 이것과는 차이가 있을까요??
감사합니다.

세벌의 이미지

kldp에서 소스코드는 code 태그 안에 넣어야 제대로 보입니다.

#include <stdio.h>
를 안 쓰고
printf()
함수 써도 에러 안 나오는 것과 비슷한 까닭일 겁니다.
Stephen Kyoungwon Kim@Google의 이미지

둘다 핵심은 컴파일러가 -c로 그 컴파일 모듈만 컴파일할 때, 함수의 type을 알 수 있느냐는 부분입니다.

본문의 예는 void dd()의 정의가 선언의 역할까지 해주는 거라서 .cpp 파일 안에선 굳이 dd의 선언이 별도로 필요하지 않은 상황일 거고요.

printf나 그밖의 함수를 선언없이 사용하는 게 C++에서는 by default로는 허용이 안 되는 걸로 기억합니다. 어쨌거나 이런 경우는 컴파일러가 타입을 추측하게 됩니다. 리턴 타입은 그냥 일괄로 int로 추측할 수도 있고, assign이 어디론가 된다면 그 variable의 타입을 보고 할 수도 있습니다. (C는 그냥 int로 추측할 거고요) 패러미터는 call site를 보고 거기에서 실제로 들어가는 패러미터를 따라 추측할 수도 있고, 혹은 더 안전하게 varidic function으로 추측할 수도 있고, 또는 printf나 scanf 같은 건 컴파일러가 미리 기억하고 있다가 기억해 둔 타입을 사용할 수도 있습니다.

leehs159의 이미지

덕분에 완벽히는 아니지만 이해가 됐어요 완벽히 이해될 수 있도록 공부해야겠네요 ㅠㅠ

댓글 달기

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