2012-04-09 27 views
8

Tôi đã đọc ở một vài nơi mà một cấu trúc C có thể được định nghĩa một cách an toàn nhiều lần, nhưng tôi nhận được lỗi "định nghĩa lại cấu trúc" từ gcc để nhân xác định cấu trúc (thông qua bao gồm nhiều). Một ví dụ rất đơn giản như sau:Cấu trúc C có thể được xác định nhiều lần không?

foo.c:

#include "a.h" 
#include "b.h" 

int main(int argc, char *argv[]) { 
    struct bar b; 
    b.a = 2; 
    return 0; 
} 

ah:

struct bar { 
    int a; 
    int b; 
}; 

bh:

#include "a.h" 

struct buz { 
    int x; 
    int y; 
}; 

Nếu tôi chạy gcc foo.c tôi nhận được:

In file included from b.h:1:0, 
       from foo.c:2: 
a.h:1:8: error: redefinition of ‘struct bar’ 
a.h:1:8: note: originally defined here 

Tôi biết tôi đã không đưa bất kỳ bao gồm bảo vệ và những người sẽ sửa lỗi biên dịch, nhưng sự hiểu biết của tôi là điều này nên làm việc dù sao. Tôi cũng đã thử hai định nghĩa struct bar trong foo.c và tôi nhận được thông báo lỗi tương tự? Vì vậy, có thể cấu trúc được định nghĩa mutiple lần trong C hay không?

Trả lời

12

Cấu trúc trong C có thể là được khai báo nhiều lần một cách an toàn, nhưng chỉ có thể được xác định một lần.

struct bar; 
    struct bar{}; 
    struct bar; 

biên dịch tốt, vì thanh chỉ được xác định một lần và được khai báo bao nhiêu lần tùy thích.

+2

ví dụ rất chính xác và ví dụ đẹp cho OP :) – Lefteris

+0

vâng, về cơ bản mọi thứ trong C có thể được khai báo nhiều lần nhưng xác định một lần. –

+0

Vâng, tôi đoán rằng sẽ xóa mọi thứ. Cảm ơn. – Elektito

0

Cấu trúc chỉ có thể được xác định một lần cho mỗi tệp bạn biên dịch. Ở đây, bạn đang bao gồm a.h hai lần. (Sau khi trực tiếp và một lần qua b.h.)

Bạn cần thay đổi mã của mình để biểu tượng chỉ được xác định một lần cho một tệp nguồn nhất định.

0

Không thể xác định chúng nhiều lần và đó là lý do tại sao bạn có #ifndef bao gồm các vệ sĩ và nên sử dụng chúng.

#include "a.h" 

bên b.h tập tin tiêu đề có nghĩa là bạn xác định lại quán bar. Nếu bạn đã #ifndef bao gồm bảo vệ này sẽ không xảy ra.

0

Bạn không có #ifdef macro trong tệp tiêu đề của mình. Nếu bạn bao gồm tiêu đề của mình trong nhiều tệp nguồn, bạn sẽ gặp phải lỗi đó.

0

Không thể xác định cùng một biểu tượng trong cùng phạm vi. Những gì bạn có thể đề cập đến là an toàn để bao gồm cấu trúc từ hai tệp C khác nhau về cơ bản có nghĩa là chúng được định nghĩa hai lần (vì không có xuất) và chia sẻ các cấu trúc này sẽ không thành vấn đề, vì chúng được biên dịch với cùng một bố cục bộ nhớ

Các vấn đề liên quan