C 파일 컴 파일 오류: 배열, 데이터 형식 이 완전 하지 않 습 니 다.

요약: C 파일 을 컴 파일 할 때 '배열 요소 의 형식 이 완전히 잘못 되 었 습 니 다' 라 는 잘못된 알림 이 자주 발생 합 니 다.본 고 는 주로 잘못된 원리 와 피 하 는 방법 을 설명 한다.
1. 불완전 유형 이란 무엇 인가
        불완전한 유형의 변 수 는 여러 번 의 성명 을 통 해 하나의 완전한 유형 으로 조합 할 수 있 습 니 다. 예 를 들 어 배열 str 성명 두 번:
char str[];
char str[10];

컴 파일 러 가 첫 번 째 성명 에 부 딪 혔 을 때 str 는 불완전한 유형 이 라 고 생각 하고 두 번 째 성명 에 부 딪 혔 을 때 str 는 완전한 유형 으로 조합 되 었 습 니 다. 만약 에 컴 파일 러 가 프로그램 파일 의 끝 에 str 를 완전한 유형 으로 조합 하지 못 하면 오 류 를 보고 할 수 있 습 니 다.
test. c: 함수 'main' 에서:
test. c: 3: 오류: 'str' 에 배열 크기 가 부족 합 니 다.
2. 불완전한 유형의 역할
    이 문법 은 무슨 소 용이 있 습 니까?왜 첫 번 째 성명 때 str 를 완전한 유형 으로 성명 하지 않 습 니까?어떤 경우 에 이렇게 하 는 데 는 일정한 이유 가 있다. 예 를 들 어 첫 번 째 성명 은 헤더 파일 에 쓰 여 있 고 두 번 째 성명 은 c 파일 에 쓰 여 있다. 그러면 배열 의 길 이 를 바 꾸 려 면 c 파일 만 바 꾸 면 된다. 헤더 파일 은 바 꾸 지 않 아 도 된다.
3. 불완전 유형 원리 와 예
    불완전한 구조 체 의 역할:
struct s {
			struct t *pt;
		};
		struct t {
			struct s *ps;
			};

struct s 와 struct 는 각각 하나의 지침 구성원 이 다른 유형 을 가리킨다.컴 파 일 러 는 struct s {struct t * pt;} 를 보면 순서대로 처리 합 니 다.struct 는 불완전한 유형 이 고 pt 는 불완전한 유형 을 가리 키 는 지침 이 라 고 생각 합 니 다. 그럼 에 도 불구 하고 이 지침 은 완전한 유형 입 니 다. 어떤 지침 이 든 4 개의 바이트 저장 공간 을 차지 하기 때 문 입 니 다. 이 점 은 명확 합 니 다.그리고 컴 파일 러 는 struct {struct s * ps;} 를 보 았 습 니 다.이때 struct 는 완전한 정 의 를 가지 고 하나의 완전한 유형 으로 조합 되 었 고 pt 의 유형 은 완전한 유형 을 가리 키 는 지침 으로 조합 되 었 다.struct s 는 앞에서 완전한 정의 가 있 기 때문에 struct s * ps;완전한 유형 을 가리 키 는 지침 도 정의 했다.
 4. 불완전한 타 입 함정 사용
     변수 구성원 이 재 귀적 으로 정의 할 수 없 음:
이러한 유형의 정 의 는 잘못된 것 입 니 다.
struct s {
	struct t ot;
};
struct t {
	struct s os;
};

    컴 파 일 러 가 struct s {struct ot;} 을 보 았 습 니 다.struct 는 불완전한 유형 이 라 고 생각 하고 구성원 ot 를 정의 할 수 없습니다. 몇 개의 바이트 를 차지 해 야 할 지 모 르 기 때 문 입 니 다.따라서 구조 체 에서 포인터 구성원 을 재 귀적 으로 정의 할 수 있 지만 변수 구성원 을 재 귀적 으로 정의 할 수 없다. 만약 에 변수 구성원 을 재 귀적 으로 정의 할 수 있다 면 struct s 에 struct 가 있 고 struct 에 또 하나의 struct s 가 있 으 며 struct s 에 또 하나의 struct 가 있다 면 이것 은 무한 재 귀적 인 정의 가 된다.즉, 우리 가 변 수 를 정의 할 때 이 변수 가 저장 공간 을 차지 하 는 크기 를 알 아야 한 다 는 것 이다.
    같은 구조 체 의 귀속 정의:
struct s {
	char data[6];
	struct s* next;
};

    컴 파일 러 가 첫 번 째 줄 struct s {를 처리 할 때 struct s 는 불완전한 유형 이 라 고 생각 합 니 다. 세 번 째 줄 struct s * next 를 처리 할 때 next 는 불완전한 유형 을 가리 키 는 지침 이 라 고 생각 합 니 다. 네 번 째 줄 로 처리 할 때};때, struct s 는 완전한 유형 이 되 었 고, next 도 완전한 유형 을 가리 키 는 지침 이 되 었 다.이와 유사 한 구조 체 는 매우 다양한 데이터 구조의 기본 구성 단원 이다. 예 를 들 어 체인 테이블, 이 진 트 리 등 은 우리 가 뒤에서 상세 하 게 소개 할 것 이다.아래 그림 은 몇 개의 struct s 구조 체 로 구 성 된 링크 를 나타 내 는데 이런 구조 체 는 링크 의 노드 (Node) 라 고 부른다.
5. 흔히 볼 수 있 는 오류
    일반적인 오 류 는 다음 과 같 습 니 다: 형식 을 먼저 사용 한 후 설명 합 니 다:
...... 
extern struct _fstruct	ps_fontinfo[]; 
...... 
struct _fstruct { 
char	 *name;	/* Postscript font name */ 
int	 xfontnum;	/* template for locating X fonts */ 
}; 

주의: psfontinfo 는 변수 입 니 다. 먼저 설명 한 후에 사 용 됩 니 다.하지만 structfstruct 형식 은 먼저 사용 한 후에 설명 합 니 다.
6. 더욱 은밀 한 고급 오류 와 해결 방법:
    위의 이 오 류 는 비교적 뚜렷 하 다. 비교적 뚜렷 하지 않 은 상황 은 헤더 파일 에 구조 체 배열 을 설명 하고 이 구조 체 의 정 의 는 다른 헤더 파일 에 있다.
global. h 에 이러한 코드 가 있 습 니 다.
#include "proc.h"
extern struct proc proc_table[];
proc. h 에 다음 과 같은 코드 가 있 습 니 다.
#include "global.h"
struct proc{int a;
	int b};
    자, 여기까지 뚜렷 한 오류 가 없습니다. 다음은 C 파일, proc. c 를 새로 만 듭 니 다.
#include "proc.h"
#include "global.h"
    여기 서 우 리 는 proc 가 global. h 앞 에 있 지만 proc. h 에 global. h 가 포함 되 어 있 기 때문에 global. h 의 내용 은 예비 처리 단계 에 먼저 포함 되 어 있 습 니 다. 그러면 비교적 애매 하 게 위의 오 류 를 일 으 킬 수 있 습 니 다.
    
    이 문 제 를 어떻게 해결 합 니까? 근원: 좋 은 디자인 을 통 해 헤더 파일 이 서로 인용 되 지 않도록 합 니 다.이 상황 을 피 할 수 없다 면 헤더 파일 의 내용 을 조정 할 수 있 습 니 다. 예 를 들 어 proc. h 의 내용 을:
struct proc{int a;
	int b};
#include "global.h"

    헤더 파일 에서 의존 하지 않 은 부분 을 맨 앞으로 끌 어 올 린 것 이다.

좋은 웹페이지 즐겨찾기