[완료]구조체 선언문을 이해 못하겠습니다.
글쓴이: SilverWhalle / 작성시간: 화, 2007/08/14 - 8:51오후
구조체 선언하는 방법에는 이렇게 세가지가 있다고 합니다.
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가 둘다 태그입니까?
Forums:
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}
음..
아... 헷갈리네요. 구조체이름과 타입이름의 차이점이란..
왜 두개를 같이 쓰는것인지..
struct도 하나의 변수타입을 만드는 것이고 그 타입명이
태그라고 이해하고 있는데요. 그래서 그 태그로 실제개체인
변수를 선언하는 것이라고 이해하고 있는데..
tag_Friend *pFriend; 처럼...
구조체이름과 타입이름을 따로 쓰는것이 잘 이해가 안됩니다.
변수선언시 쓰이지도 않을 구조체명이 왜 타입이름과 동시에
쓰이는것인지...
좀 생각을 해 봐야겠네요. 감사합니다.
정확한 예로
정확한 예로 들기에는 제 실력이 미천합니다만
간혹 큰 헤더파일을 포함하지 않기 위해
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;
> tag_Friend *pFriend; 처럼...
> 구조체이름과 타입이름을 따로 쓰는것이 잘 이해가 안됩니다.
struct tag_Friend *pFriend 로 써야죠.
이거 굉장히 귀찮습니다.
그래서 다시 typedef를 쓰는 거예요.
> 변수선언시 쓰이지도 않을 구조체명이 왜 타입이름과 동시에
> 쓰이는것인지...
태그가 꼭 필요할 때가 있어요. linked list나 tree 같은
자기참조 구조체(self-referential struct)의 경우죠.
아.
감사합니다. 구형 c컴파일러에선 struct를 명시해줘야 한다던데
gcc가 struct가 필요하네요. 제대로 이해한건지는 모르겠지만
감이오는것 같습니다. 구조체이름(태그)은 선언시 struct키워드
가 필요하지만 struct와 구조체이름을 typedef로 아예 한데 묶어서
타입이름을 쓰게 되는 거군요.
> 구형 c컴파일러에선
> 구형 c컴파일러에선 struct를 명시해줘야 한다던데
> gcc가 struct가 필요하네요.
문법상 원래 써야 하는 거예요. --;
구조체명을 명시해
구조체명을 명시해 주시면, 컴파일 에러 메세지를 정확하게 볼 수 있다는 장점이 있습니다.
type name만으로 선언할 경우에는 compiler가 아무개 struct이라고 말해줄 겁니다.
C는 아래 처럼 type name과 struct name이 같은 경우도 선언이 가능합니다.
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문을 쓰더라도
정작 '구조체형 자신의 포인터 멤버'를 선언하려고 할 때에는 아직 형의 선언이 완료된 것이 아니기 때문에
구조체형 선언의 내부에선 typedef로 선언한 타입명은 쓸 수 없습니다.
그래서 앞에도 태그를 붙여서 그걸 이용해서 '구조체형 자신의 포인터 멤버'를 쓸 수 있습니다.
이 경우엔 forward declaration도 가능합니다.
뭐 다들 아시는 얘기지만... -.- 이런 식으로도 쓸 수 있습니다.
댓글 달기