헤더 파일 순서?

cartman의 이미지

프로그램을 짜다 보면 가끔 황당한 일을 접할 때가 있습니다.

분명히 제대로 짠 것 같은데 "reference 어쩌구 저쩌구" 하면서 link 에러가 나고,

그것 때문에 이리 저리 고생하다가 결국은 헤더 파일을 include하는 순서를 바꾸니까 해결 되더군요.

어디서도 헤더 파일을 include하는 순서가 프로그램의 실행에 영향을 미친다는 이야기는 못 들었었는데,

혹시 비슷한 일을 겪으신 분은 안 계신가요?

그리고 원인이 뭐였는지도 알 수 있을까요?

espereto의 이미지

저도 여러 번 헤더 파일 순서때문에 애먹었던 적이 있습니다.
제 경우는 헤더파일에서 쓰인 매크로와 #ifdef ... 같은 놈들 때문이었습니다.

a.h 에 b 가 선언되었을 때, b.h 에서 b가 선언되는 부분을 건너뛰는데, 하필이면 a.h에 선언안된 내용이 포함되어 있었고, 또 하필이면 소스에서는 그 부분을 이용하려 한다...... 뭐 이런 경우가 아니었을까 합니다. :-)

a.h

#ifndef b
#define b
void funcb(arg1, arg2, ...)
#endif

b.h

#ifndef b
#define b
void funcb(arg1, arg2, ...)
void funcc(arg1, arg2, ...)
#endif

이런 식이면, a.h 인클루드 한 다음 b.h를 인클루드하면 funcc 는 선언되지 않죠. 뭐, c 컴파일러라면 어지간하면 선언안 된 함수도 링크가 가능한데, c++ 컴파일러는 링크 에러를 내뿜지요.

아니면, 선언된 매크로중에서 먼저 선언된 헤더 파일에는 별 문제 없지만 나중에 선언된 헤더 파일의 매크로에는 뭔가 특별한 함수를 호출한다던가...... 물론, 매크로 이름이 동일하고, 위와 같은 식으로 처리되었다면 .....

여하튼, 제 경우는 이런 경우가 주로 있었습니다.

근데, 대부분 문제된 헤더 파일들은 회사에서 개발된 소스코드의 헤더파일들 이었다는... ;;

맹고이의 이미지

보통...

Quote:
"the most specific to the most general."

의 순으로 헤더파일을 인클루드 한다고 책에서 보았습니다.

그러니까...

Quote:
1. 로컬디렉토리에 있는 헤더
2. 자기가 만든 툴의 헤더
3. Third-party library headers
4. Standard C++ Library headers
5. C library headers

이런 순서로...
그냥 참고삼아 적어보았습니다. ^^;

댓글 달기

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