2016-01-06 129 views
1

一個目錄包含下列文件:使用結構類型定義在多個.C&.h文件

  1. 「車」 的文件:

一個。 car.h:

#ifndef __CAR_H__ 
#define __CAR_H__ 

typedef struct car car_t; 
... 
(some functions declarations) 
... 
#endif /* __CAR_H__ */ 

b。 car.c

#include <stdio.h> 
#include <stdlib.h> 
#include "car.h" 

typedef struct car_node 
{ 
    void *data; 
    struct car_node *next; 
    struct car_node *prev; 
} car_node_t; 

struct car 
{ 
    car_node_t head; 
    car_node_t tail; 
}; 
... 
(some functions implementations) 
... 

c。 car_main.c

#include <stdio.h> 
#include "car.h" 

int main() 
{ 
    ... 
    (some tests) 
    ... 
} 

2. 「車」 的文件:

一個。 vehicles.h

#ifndef __VEHICLES_H__ 
#define __VEHICLES_H__ 

typedef struct vehicles vehicles_t; 

... 
(some functions declarations) 
... 

#endif /* ifndef __VEHICLES_H__ */ 

b。車輛。c

#include <stdio.h> 
#include "car.h" 
#include "vehicles.h" 

struct vehicles 
{ 
    car_t carlist; 
    void *data; 
}; 

c。 vehicles_main.c

#include <stdio.h> 
#include "car.h" 
#include "vehicles.h" 

int main() 
{ 
    ... 
    (some tests) 
    ... 
} 

編譯時使用一個makefile如下,一切都很正常: car.c,car_main.c。

但是,當我編譯生成文件下列文件:car.c,vehicles.c,vehicles_main.c,我得到以下錯誤:

vehicles.c: error: field ‘carlist’ has incomplete type 

我的問題是:爲什麼編譯器不如果car.h包含在vehicles.c中,則識別car.h中的typedef car_t?

回答

2

的問題是,裏面vehicles.c,編譯器需要知道什麼是car_t實際上,而你只提供它,它應該是什麼稱爲。什麼是car_t實際上是在car.c中定義的。爲了解決這個問題,你要麼必須做出carlist指針(因爲編譯器並不需要一個完整的類型),或者你必須在結構定義移動到.h文件:

car.h

typedef struct car_node 
{ 
    void *data; 
    struct car_node *next; 
    struct car_node *prev; 
} car_node_t; 

typedef struct car { 
    car_node_t head; 
    car_node_t tail; 
} car_t; 
相關問題