이 오류는 변수 선언 시 컴파일러가 해당 타입의 메모리 크기를 결정할 수 없을 때 발생합니다. 특히 구조체나 typedef로 선언만 해놓고 정의하지 않은 타입을 변수로 선언하면, 컴파일러는 메모리 크기를 계산할 수 없어 오류를 발생시킵니다.
이는 선언만 있는 불완전한 타입(incomplete type)에 변수를 선언하려고 할 때 자주 발생하는 오류입니다.
● 오류 예제
// file1.h
typedef struct Node Node;
// file2.c
#include "file1.h"
int main() {
Node n; // 오류: Node는 정의되지 않음
return 0;
}
위 코드에서 Node는 typedef로 선언만 되어 있고, 구조체의 실제 정의가 없기 때문에 크기를 계산할 수 없습니다. 컴파일러는 다음과 같은 오류를 출력합니다.
error: storage size of ‘n’ isn’t known
● 해결 방법
변수를 선언하기 전에 해당 타입이 반드시 정의되어 있어야 합니다. 정의 없이 선언만 한 경우, 컴파일러는 메모리 크기를 결정할 수 없습니다.
// 수정된 예시
typedef struct Node {
int data;
} Node;
int main() {
Node n; // 정의가 있으므로 선언 가능
n.data = 100;
return 0;
}
또는 포인터를 사용하는 경우, 구조체의 크기를 몰라도 선언이 가능하므로 다음과 같이 사용할 수 있습니다.
typedef struct Node Node;
int main() {
Node *p; // 포인터는 선언만으로도 사용 가능
return 0;
}
● 실전 팁
- 불완전 타입에는 포인터만 선언 가능하며, 변수를 직접 선언하려면 정의가 필요합니다.
- 헤더 파일에서 typedef 선언만 하고 정의를 다른 파일에 둘 경우, 해당 파일에서도 정의를 포함하도록 주의하세요.
- 구조체 포인터를 활용하면 전방 선언만으로도 다양한 설계를 유연하게 할 수 있습니다.
C언어는 메모리 크기를 알 수 없는 타입에 대해 변수를 선언하는 것을 허용하지 않기 때문에, 선언과 정의의 차이를 명확히 이해하고 변수 선언 전에 구조체 정의가 포함되어 있는지 반드시 확인해야 합니다.