#include 에 관한 질문입니다.

김유석의 이미지

헤더에 관한 제 프로그래밍 스타일은 다음과 같습니다.

main.h

#ifndef __main_h__
#define __main_h__

#include
#include

#endif // end of __main_h__

위와 같이 헤더에 인클루드를할 헤더를 선언하는 방식을 사용하고 있습니다. 그런데 아는 분이 위와 같이 헤더 파일에서 인클루드를 하지 않고 소스에서 인클루드를 하는게 좋다고 하셔서 어떤게 나은 것인지 질문 드립니다.

cppig1995의 이미지

별 상관 없다고 생각합니다.

예를 들어, FILE 구조체를 인자로 받는 함수의 프로토타입을 정의하는 헤더라면 헤더에 stdio.h를 포함시키는 것이 명확하겠지만, 이런 경우가 아니라 정의부분에서만 FILE을 사용한다면 소스에서 stdio.h를 포함시키는 것이 더 명확할 것입니다.

위의 말이 정확한지는 모르겠지만, 어쨌든 저는 이렇게 생각하고 이렇게 사용합니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

김유석의 이미지

감사합니다.

lacovnk의 이미지

헤더에서 보여줄 필요가 없는 것은 보여주지 않는 것이 좋습니다.

돼지군님이 말씀하셨듯, 함수 인자이면 당연히 포함시켜야겠지요. (에러가 날테니..)

하지만 내부 구현을 위해 malloc을 쓰고 뭘 쓰고.. 이런 건 헤더 파일에 넣으면 바람직하지 않습니다.

예외 상황이 있을까요? 음..

powerson의 이미지


전 주로 소스보다는 헤더파일에 많이 넣는 편입니다. 저 같은 경우는 보통 소스와 맞물려서 헤더를 하나 더 제작하는 편이거든요. 물론 관습적으로 하는 방식이 존재할 수도 있겠지만, 각각의 편한 기호에 맞춰서 만드면 되지 않을까요?

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

lacovnk의 이미지

내부 구현에 특정 외부 라이브러리를 쓰고, static link를 걸었다고 생각해봅시다. 그런데 그 특정 외부 라이브러리를 헤더 파일에 넣어야 할까요? :(

헤더와 object 파일을 넘겨줘서 그냥 링크만 하면 되는 것을, 컴파일 할 때 그 특정 외부 라이브러리를 요구하게 되어버립니다. 뭐 지우고 써도 되겠습니다만 :(

헤더를 분리하고 소스를 분리하는 의도를 잘 살려야 한다고 생각합니다. 사소하지만 지키기 어려운 것은 아니지 않습니까 :)

powerson의 이미지


제가 말씀 드린 것은 지키지 말자 라고 말씀 드린것은 아닙니다. ^^ 이렇게 짜는 것이 좋다, 저렇게 짜는 것이 좋다 라는 방법론에 대해서 그건 방법론이지, 꼭 지켜야만 하는 것은 아니라고 생각하기 때문입니다. 제가 아직 미숙하다 보니 개발을 하다보면, 주먹구구식으로 헤더 만들고 소스 짜고 이런 경우도 존재해서 그런거 같습니다. 나중에는 이러한 사소한 것들을 지키기 위해 코드 수정을 할려면, 양이 많아서 못하는 경우도 발생을 하더군요. 아무튼 좋은 말씀 감사합니다. ^^

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

lacovnk의 이미지

Quote:
꼭 지켜야만 하는 것은 아니라고 생각하기 때문입니다.

제가 보기에는 방법론이나 코딩 관습이 아니라, 원칙이고 구성 원리.. 인 것 같습니다.

댓글 달기

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