728x90
반응형
형식의 이름은 선언이 완성된 직후가 아니라 발견된 직후에 사용할 수 있게 된다.
struct Link {
Link∗ previous;
Link∗ successor;
};
그러나 선언이 완성될 때까지 구조체는 새 객체를 선언할 수 없다.
struct No_good {
No_good member; // error : recursive definition
};
컴파일러가 No_good의 크기를 결정할 수 없기 때문에 이것은 오류다. 두 개(혹은 그 이상)의 구조체가 서로 참조할 수 있도록 하려면 이름을 구조체의 이름으로 선언할 수 없다.
struct List; // struct name declaration: List to be defined later
struct Link {
Link∗ pre;
Link∗ suc;
List∗ member_of;
int data;
};
struct List {
Link∗ head;
};
List의 첫 번째 선언이 없으면 Link 선언에서 포인터 유형 List*를 사용하면 구문 오류가 발생한다. 구조체의 이름은 멤버의 이름이나 구조의 크기를 알 필요가 없는 한 유형이 정의되기 전에 사용할 수 있다. 그러나 구조체 선언이 완료될 때까지 해당 구조체는 불완전한 형석이다.
struct S; // ‘‘S’’ is the name of some type
extern S a;
S f();
void g(S);
S∗ h(S∗);
유형 S가 정의되지 않는 한 이러한 선언은 사용할 수 없다.
void k(S∗ p)
{
S a; // error : S not defined; size needed to allocate
f(); // error : S not defined; size needed to return value
g(a); // error : S not defined; size needed to pass argument
p−>m = 7; // error : S not defined; member name not known
S∗ q = h(p); // ok: pointers can be allocated and passed
q−>m = 7; // error : S not defined; member name not known
}
C의 경위에 따르기 때문에 같은 범위에서 같은 이름을 가진 구조체와 비 구조체를 선언하는 것은 가능하다.
struct stat { /* ... */ };
int stat(char∗ name, struct stat∗ buf);
이 경우 일반 이름(stat)은 구조체가 아닌 이름이며 구조체는 접두사 struct로 참조해야 한다. 마찬가지로 class, union 및 enum 키워드를 명확하게 하기 위한 접두사로 사용할 수 있다. 그러나 그러한 명시적 명확성을 필요로 하기 위해서는 이름을 오버 로드하지 않는 것이 가장 좋다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] 구조체와 배열 (0) | 2022.01.03 |
---|---|
[C++] 구조체와 클래스 (0) | 2022.01.03 |
[C++] 구조체 layout (0) | 2022.01.03 |
[C++] 구조체 (structure) (0) | 2021.12.29 |
[C++] 포인터와 참조 (1) | 2021.12.29 |