2012-04-30 16 views
10

Tôi đang sử dụng Kdevelop trong Kubuntu. Tôi đã tuyên bố một cấu trúc trong file datasetup.h tôi:Sử dụng cấu trúc trong tệp tiêu đề "loại không xác định" lỗi

#ifndef A_H 
#define A_H 

struct georeg_val { 

    int p; 
    double h; 
    double hfov; 
    double vfov; 
}; 

#endif 

Bây giờ khi tôi sử dụng nó trong file main.c tôi

int main() 
{ 
    georeg_val gval; 

    read_data(gval); //this is in a .cpp file 

} 

tôi nhận được lỗi sau:

georeg_chain.c:7:3: error: unknown type name 'georeg_val'

(Đây là dòng georeg_val gval;)

Tôi sẽ đánh giá cao nếu có ai có thể giúp tôi giải quyết lỗi này.

+0

Bạn đang trộn C và C++ với nhau ở đây? –

+0

Đảm bảo bạn đang nhập tiêu đề: 'import" datasetup.h "'. – piperchester

Trả lời

21

Trong C ta có hai khả năng để khai báo cấu trúc:

struct STRUCT_NAME {} ; 

hoặc

typedef struct {} STRUCT_ALIAS; 

Nếu bạn sử dụng phương pháp đầu tiên (cho struct một tên) - bạn phải xác định biến bằng cách đánh dấu nó một cách rõ ràng là a struct:

struct STRUCT_NAME myStruct; 

Tuy nhiên nếu bạn sử dụng phương pháp thứ hai (cung cấp cấu trúc s) sau đó bạn có thể bỏ qua struct định - trình biên dịch có thể suy ra loại biến chỉ cho nó alias:

STRUCT_ALIAS myStruct; 

thưởng điểm: Bạn có thể khai báo struct với cả hai đó là tên và bí danh:

typedef struct STRUCT_TAG {} STRUCT_TAG; 
// here STRUCT_NAME == STRUCT_ALIAS 

Sau đó, trong định nghĩa biến, bạn có thể sử dụng phương thức đầu tiên hoặc thứ hai. Tại sao cả hai thế giới đều tốt? Bí danh cấu trúc cho phép bạn tạo các định nghĩa biến cấu trúc ngắn hơn - đôi khi là một điều tốt. Nhưng tên cấu trúc cho phép bạn tạo forward declarations. Đó là công cụ không thể thiếu trong một số trường hợp - cân nhắc bạn có tham chiếu vòng tròn giữa cấu trúc:

struct A { 
    struct B * b; 
} 
struct B { 
    struct A * a; 
} 

Bên cạnh đó kiến ​​trúc này có thể có những thiếu sót - nét tròn này sẽ biên dịch khi cấu trúc được khai báo trong cách đầu tiên (với tên) VÀ struct con trỏ được tham chiếu rõ ràng bằng cách đánh dấu chúng là struct.

6

Nếu bạn phải xác định một loại mới, bạn phải viết:

typedef struct { 

    int p; 
    double h; 
    double hfov; 
    double vfov; 
} georeg_val ; 

Sau đó, bạn có thể sử dụng georeg_val như một loại mới.

+4

Hoặc chuyển sang 'struct georeg_val gval;' trong 'main' –

+1

@dead_jake Ngoài ra' # include' tệp tiêu đề trong main.c (nếu bạn chưa làm như vậy) – Praetorian

3

Định nghĩa một cấu trúc kiểu (trên ví dụ này, một tìm kiếm nhị phân cây struct):

struct tree { 
    int info; 
    struct tree *left; 
    struct tree *right; 
} 

typedef struct tree treeNode; 

Khai báo một chức năng Eg .:

treeNode *insertElement(treeNode *treeA, int number);