2012-06-17 37 views
14

Tôi có 4 tệp (2 tiêu đề và 2 tệp mã). FileA.cpp, FileA.h, FileB.cpp, FileB.hC++ nhiều định nghĩa của biến số

FileA.cpp:

#include "FileA.h" 

int main() 
{ 
    hello(); 
    return 0; 
} 

void hello() 
{ 
    //code here 
} 

FileA.h:

#ifndef FILEA_H_ 
#define FILEA_H_ 
#include "FileB.h" 
void hello(); 

#endif /* FILEA_H_ */ 

FileB.cpp:

#include "FileB.h" 

void world() 
{ 
    //more code; 
} 

FileB.h:

#ifndef FILEB_H_ 
#define FILEB_H_ 

int wat; 
void world(); 


#endif /* FILEB_H_ */ 

khi tôi cố gắng biên dịch (với nhật thực), tôi nhận được "nhiều định nghĩa về` wat '" Và tôi không biết tại sao, có vẻ như nó sẽ hoạt động tốt.

+4

Chào mừng bạn đến với thế giới liên kết .. –

Trả lời

22

Tôi sẽ không bao gồm tất cả các chi tiết, nhưng bạn định nghĩa một biến toàn cầu, wat hai lần trong uint biên dịch của bạn.

Để khắc phục, sử dụng như sau:

FileB.h

extern int wat; 

FileB.cpp

int wat = 0; 

này (extern) cho các biên dịch rằng biến wat tồn tại ở đâu đó, và rằng nó cần phải tìm thấy nó trên riêng của nó (trong trường hợp này, nó là trong FileB.cpp)

+0

Điều đó có ảnh hưởng đến tối ưu hóa cho các biến 'const' không? Tối ưu hóa trình biên dịch có chạy ở giai đoạn biên dịch hay giai đoạn liên kết không? – ar2015

0

Tuyên bố biến wat đó là định nghĩa phải thuộc về tệp cpp. Nó giống như bạn sẽ đặt các cơ quan chức năng của bạn vào tiêu đề.

Bạn cần đặt extern trước khai báo wat và sao chép khai báo hiện tại của bạn mà không có extern vào một trong các tệp cpp.

3

Bạn nhận được nhiều định nghĩa vì wat được khai báo ở phạm vi tệp và hiển thị hai lần trong 2 tệp nguồn.

Thay vào đó, hãy biến biến số extern và xác định nó trong chính xác một tệp nguồn.

extern int wat; // In FileB.h 

int wat; // In FileB.cpp 
1

Tôi tìm thấy câu trả lời ngay bây giờ (tôi đoán xem các tập tin cái khác đã giúp) Vấn đề là trình biên dịch tạo ra một FileB.o có định nghĩa wat, và sau đó nó cố gắng biên dịch FilB.o với FileA.cpp, trong khi FileA.h có một tệp FileB.h nó bây giờ cũng sẽ có định nghĩa về wat.

+0

Tôi chỉ có một tệp blabla.h duy nhất và có kèm theo bảo vệ (#ifndef xxx_H ...) và một biến toàn cầu duy nhất. Tại thời gian biên dịch, tôi nhận được nhiều định nghĩa về lỗi 'myglobal_variable'. –

6

Không khai báo biến trong tiêu đề. #include nghĩa đen sao chép và dán nội dung của tệp vào tệp khác (nghĩa là, bất kỳ tệp nào thực hiện sao chép nội dung của FileB.h vào đó, nghĩa là int wat được xác định trong mọi tệp thực hiện #include "FileB.h").

Nếu bạn muốn truy cập wat từ FileA.cpp và được khai báo trong FileB.cpp, bạn có thể đánh dấu nó là extern trong FileA.cpp.

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