구조체의 의존성..

parrier의 이미지

오픈 소스의 소스 코드를 보고 있는데요, 구조체의 의존성에 관한 부분이 이해가 안되는 부분이 있어서 글을 올립니다.

struct abc{
char a;
B* b;
}

struct B{
abc* c;
char b;
}

이렇게 되어 있는 부분이 있습니다. abc의 member 변수 b에 대한 타입 선언이 아래에 선언되었는데요.

제가 이런 식으로 테스트하면 에러가 발생하는데, 어떻게 본 소스에서는 에러를 피하는 것인지 모르겠네요.

뭔가 다른 기법이 있는 것일까요? 멤버 변수 b의 타입이 구조체 abc의 선언 앞에 쓰이지 않았는데 쓸수 있는 이유.. 흠..

klara의 이미지

본문에 적은게 다가 아닐것입니다.
예를 들면 struct abc{...};의 이전 어딘가에 struct B;와 같이 전방 선언(forward declaration)이 있겠죠.

parrier의 이미지

꼭 앞에 모든 내용이 구현되어 있지 않아도, 컴파일러가 알아서 다 이해한다는 말이로군요^^;

main 앞에 왜 함수의 원형을 미리 선언해 두는 건지와... 같은 의미네요.

이론은 알고 있었는데 지금까지 깨닫지 못하고 있다가.. 이제서야 깨닫네요. ^^;

감사합니다 . ㅎㅎ

P.S: 혹시 제가 이해한 것이 틀린 것이라면 ㅡ.ㅡ;;; 다시 지도 부탁드립니다 ;.;

-_-v

klara의 이미지

멤버가 포인터(B*)이기 때문입니다.
전방선언이 되있더라도, 포인터가 아니라 구조체 그자체(B)를 선언해버리면, 전방선언만으로는 크기를 알수 없으므로 컴파일시에 에러가 납니다.
포인터의 경우는 실제 구조체의 크기와 상관없이 크기가 고정되어있으니까(보통 4바이트) 그 시점에서 실제로 B의 크기가 얼마인지 몰라도 컴파일이 가능하죠.
또한 B내부의 정보에 접근하지 않았다는 것도 중요합니다.
전방선언만으로는 B안에 뭐가 있는지 모르니까요.
전방 선헌후 실제 B의 선언이 나타나기 전에 포인터로 B의 멤버에 접근할려고하면 또 컴파일 에러가 나겠죠.

haze11의 이미지

typedef struct _a a;

struct _a
{
...
};

처럼 미리 typedef 해두면 문제 없습니다. =.=

parrier의 이미지

신경써주셔서 감사합니다 ^_^~

-_-v

댓글 달기

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