[완료]구조체 선언문을 이해 못하겠습니다.

SilverWhalle의 이미지

구조체 선언하는 방법에는 이렇게 세가지가 있다고 합니다.
1. struct{
...
}friend; -- 바로 변수를 지정하는 방식이며 여러번 선언할 수 없습니다.

2. struct tag_friend{
...
};
tag_friend Friend; --태그 tag_friend를 사용해서 여러번 사용합니다.

3. typedef struct{
....
}FriendType;
FrinedType Friend; -- typedef를 사용해서 태그효과를 냅니다.

위와같이 세가지 방식이 있다고 책에 나와있습니다..
그런데 현재 보고 있는 유닉스 책에서 이런 선언이 있습니다.
typedef struct list_struct{
...
}list_t;
static list_t endlist;
라고 되어 있습니다. 도대체 이 방식은 무엇인가요? 태그가 두개입니까?
list_struct 와 list_t가 둘다 태그입니까?

jg의 이미지

typedef struct 구조체이름 {
} 타입이름;

struct 구조체이름 {
};
 
typedef struct 구조체이름 타입이름;

위의 두 가지 방법의 선언은 같은 효과를 냅니다.

--
perl -e's@@JEON Myoung-jin@;sub man{s| _|her e|}
sub see{s;^;Just;;u;s;e ;Perl ;;to;print$_,$/}$uperMan=M;
s=^....=U are not=;s~$uperMan~~;&admitIt;s=U are = A=;s|young|_|;&man;
sub admitIt{say;ye;s!-\w+! Hacker!};see U'

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

SilverWhalle의 이미지

아... 헷갈리네요. 구조체이름과 타입이름의 차이점이란..
왜 두개를 같이 쓰는것인지..
struct도 하나의 변수타입을 만드는 것이고 그 타입명이
태그라고 이해하고 있는데요. 그래서 그 태그로 실제개체인
변수를 선언하는 것이라고 이해하고 있는데..
tag_Friend *pFriend; 처럼...

구조체이름과 타입이름을 따로 쓰는것이 잘 이해가 안됩니다.
변수선언시 쓰이지도 않을 구조체명이 왜 타입이름과 동시에
쓰이는것인지...
좀 생각을 해 봐야겠네요. 감사합니다.

jg의 이미지

정확한 예로 들기에는 제 실력이 미천합니다만
간혹 큰 헤더파일을 포함하지 않기 위해

typedef struct 구조체이름 타입이름;

으로 선언하는 경우가 있는데요. 이럴 때 구조체 이름이 필요하기 때문에
구조체 이름을 남기는 편이 좋다고 생각합니다.

--
참고한글: http://kldp.org/node/85252

--
perl -e's@@JEON Myoung-jin@;sub man{s| _|her e|}
sub see{s;^;Just;;u;s;e ;Perl ;;to;print$_,$/}$uperMan=M;
s=^....=U are not=;s~$uperMan~~;&admitIt;s=U are = A=;s|young|_|;&man;
sub admitIt{say;ye;s!-\w+! Hacker!};see U'

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

익명 사용자의 이미지

> tag_Friend *pFriend; 처럼...
> 구조체이름과 타입이름을 따로 쓰는것이 잘 이해가 안됩니다.

struct tag_Friend *pFriend 로 써야죠.
이거 굉장히 귀찮습니다.
그래서 다시 typedef를 쓰는 거예요.

> 변수선언시 쓰이지도 않을 구조체명이 왜 타입이름과 동시에
> 쓰이는것인지...

태그가 꼭 필요할 때가 있어요. linked list나 tree 같은
자기참조 구조체(self-referential struct)의 경우죠.

struct node {
   struct node *next;
};

SilverWhalle의 이미지

감사합니다. 구형 c컴파일러에선 struct를 명시해줘야 한다던데
gcc가 struct가 필요하네요. 제대로 이해한건지는 모르겠지만
감이오는것 같습니다. 구조체이름(태그)은 선언시 struct키워드
가 필요하지만 struct와 구조체이름을 typedef로 아예 한데 묶어서
타입이름을 쓰게 되는 거군요.

익명 사용자의 이미지

> 구형 c컴파일러에선 struct를 명시해줘야 한다던데
> gcc가 struct가 필요하네요.

문법상 원래 써야 하는 거예요. --;

jinyeong의 이미지

구조체명을 명시해 주시면, 컴파일 에러 메세지를 정확하게 볼 수 있다는 장점이 있습니다.
type name만으로 선언할 경우에는 compiler가 아무개 struct이라고 말해줄 겁니다.

C는 아래 처럼 type name과 struct name이 같은 경우도 선언이 가능합니다.

typedef struct foo {
   ....
} foo;

C++의 경우는 직관적으로 'struct' 명시적으로 필요하지 않으므로,
위와 같은 경우가 안되어야 할 것 같지만, g++에서는 가능하더군요.


--
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?

김일영의 이미지

대표적인 예가 링크드 리스트의 노드를 만들기 위한 구조체를 선언할 경우,
나중에 사용을 간단히 하기 위해 typedef문을 쓰더라도
정작 '구조체형 자신의 포인터 멤버'를 선언하려고 할 때에는 아직 형의 선언이 완료된 것이 아니기 때문에
구조체형 선언의 내부에선 typedef로 선언한 타입명은 쓸 수 없습니다.
그래서 앞에도 태그를 붙여서 그걸 이용해서 '구조체형 자신의 포인터 멤버'를 쓸 수 있습니다.

jick의 이미지

뭐 다들 아시는 얘기지만... -.- 이런 식으로도 쓸 수 있습니다.

typedef struct my_s my_t;
struct my_s {
    my_t *next;
    ...blah blah...
};

댓글 달기

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