Program Language/C & C++

[C++] 구조체 이름

야곰야곰+책벌레 2022. 1. 3. 14:22
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