2011-07-30 26 views
7

Tôi có hai tập tin cpp trong một dự án, main.cpp và myfile.cppSử dụng struct trong tập tin cpp khác nhau

Tôi đã globaly định nghĩa struct mystruct trong main.cpp, bây giờ tôi muốn sử dụng struct này trong myfile.cpp. Khi tôi viết mystruct trong một tập tin tiêu đề và bao gồm trong cả hai tập tin cpp tôi nhận được một lỗi, nói rằng redructinition mystruct. Làm thế nào tôi nên giải quyết vấn đề này.

+0

bạn nên thêm một số mã để có câu trả lời cụ thể hơn cho câu hỏi của mình. – Matthieu

Trả lời

0

Vấn đề là về cơ bản bạn có cùng một mã hai lần như một kết quả nếu bạn thấy một bao gồm chỉ là một nhập mã.

Bạn có thể sử dụng #ifdef để sửa chữa nó, xem http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

+0

Tại sao điều này lại được bình chọn? Từ những gì người hỏi nói, đây là câu trả lời có khả năng nhất IMO –

0

Bạn nên di chuyển các cấu trúc chung vào một tập tin header và bao gồm rằng tiêu đề trong cả hai tập tin. Bất kỳ giải pháp khác là một giải pháp.

0

Tuyên bố và định nghĩa là hai điều khác nhau. Đối với trường hợp của bạn, bạn đang phân bổ không gian cho cấu trúc của bạn trong main.cpp. Trong tiêu đề của bạn, bạn nên sử dụng công cụ sửa đổi bên ngoài cho cấu trúc của bạn để tất cả các tệp có chứa tệp tiêu đề sẽ tìm trong không gian tên chung cho cấu trúc. Hy vọng nó giúp.

0

C/C++ tiếp cận tiêu chuẩn:

// source.h 
Put all struct, class, typedef, macro definitions, extern variable declaraltions 


// source.cpp 
Implement the class, functions, define global/external variables 


// main.cpp, and other parts of program 
#include"source.h" 
+1

@Downvoter, hãy giải thích lý do. Tôi không hiểu có chuyện gì vậy? – Ajay

0

Phần header là nơi bạn khai báo những gì struct của bạn sẽ bao gồm (có thể là một tập tin common.h bao gồm theo main.cppmyfile.cpp):

struct MyStruct { 
    int messageID; 
    int tempVariable; 
}; 

Trong main.cpp của bạn, đây là nơi bạn thực sự sử dụng cấu trúc:

void someFunction() { 
    struct MyStruct tempStruct; 

    // do something with it 
    tempStruct.messageID = 1; 

} 

Không đặt định nghĩa của struct trong cả hai main.hmain.cpp - hoặc bạn sẽ nhận được lỗi xác định lại!

Ngoài ra, không bao gồm tệp cpp - bao gồm tệp tiêu đề (ví dụ: common.h). Không biết nhiều hơn về cấu trúc chương trình của bạn, thật khó để cung cấp thông tin tốt hơn.

0

Bạn nên xác định cấu trúc trong file header chỉ, bạn nên loại bỏ nét cao từ main.cpp

+0

extern là không cần thiết nếu bạn có một tập tin tiêu đề chung. Extern chỉ cần thiết nếu bạn muốn có một đối tượng struct toàn cục được chia sẻ bởi những người khác. –

+0

@ 0A0D, tôi hiểu câu hỏi của Op chính xác theo cách này. Chú ý đến lỗi liên kết định nghĩa lại được đề cập trong câu hỏi. – unkulunkulu

+0

Ông định nghĩa lại MyStruct hai lần .. extern sẽ không sửa chữa nó. Extern có nghĩa là liên kết bên ngoài. Trình biên dịch sẽ tin tưởng các lập trình viên về sau rằng đối tượng sẽ được định vị bởi trình liên kết. Nếu không, nó sẽ ném một lỗi liên kết. Anh ta không có lỗi liên kết. Bạn nên học cách extern hoạt động. –

0

Có thể bạn có thể cho biết thêm thông tin về cách bố trí của dự án của bạn là gì.

Going by the đoán, có lẽ vấn đề của bạn có thể một trong hai:

  1. bạn muốn khai phía trước của struct.

  2. sử dụng bộ bao gồm để bảo vệ định nghĩa lại.

Xem các liên kết sau đây để biết làm thế nào để xử lý cả hai:

http://www.adp-gmbh.ch/cpp/forward_decl.html

Các tập tin tiêu đề cũng sử dụng bao gồm bảo vệ, vì vậy bạn có thể tìm ra chính xác những gì có thể giải quyết vấn đề của bạn.

0

Nếu bạn muốn chia sẻ bất kỳ biến nào giữa nhiều tệp cpp, bạn nên khai báo nó trong tiêu đề là extern. Và không có extern trong một của các tệp C++ đó.

Nếu bạn không làm điều đó, nó sẽ thiếu liên kết, vì nhiều đối tượng sẽ có cùng tên với cùng một tên. Thay vào đó, khi sử dụng extern một đối tượng sẽ có biến này và các đối tượng khác liên kết nó.

18

Nếu bạn đang cố gắng chia sẻ các định nghĩa của một cấu trúc giữa các đơn vị biên dịch (tệp cpp), cách thông thường là: Đặt định nghĩa cấu trúc của bạn trong tệp tiêu đề (mystruct.h). Nếu cấu trúc có chứa bất kỳ phương thức nào (nghĩa là nó là một lớp với tất cả thành viên công khai theo mặc định), bạn có thể triển khai chúng trong tệp mystruct.CPP hoặc, nếu chúng là trọng lượng nhẹ, trực tiếp trong cấu trúc (làm cho chúng theo mặc định là inline)).

mystruct.h:

#ifndef MYSTRUCT_H 
#define MYSTRUCT_H 

struct MyStruct 
{ 
    int x; 
    void f1() { /* Implementation here. */ } 
    void f2(); /* Implemented in mystruct.cpp */ 
}; 

#endif 

mystruct.cpp

#include "mystruct.h" 
// Implementation of f2() goes here 
void MyStruct::f2() { ... } 

Bạn có thể sử dụng cấu trúc của bạn trong nhiều file cpp như bạn muốn, chỉ cần #include mystruct.h:

chính .cpp

#include "mystruct.h" 
int main() 
{ 
    MyStruct myStruct; 
    myStruct.x = 1; 
    myStruct.f2(); 
    // etc... 
} 

Nếu, mặt khác, bạn đang cố gắng chia sẻ một toàn cầu dụ của struct trên một số đơn vị biên soạn (nó không phải là hoàn toàn rõ ràng từ câu hỏi của bạn), làm như trên mà còn thêm

extern MyStruct globalStruct; 

để mystruct .h. Điều này sẽ thông báo rằng một cá thể có sẵn với liên kết bên ngoài; nói cách khác là một biến tồn tại nhưng được khởi tạo ở nơi khác (trong trường hợp của bạn trong mystruct.cpp). Thêm khởi tạo của cá thể chung vào mystruct.cpp:

MyStruct globalStruct;

Điều này quan trọng. Nếu không tạo thủ công một phiên bản globalStruct, bạn sẽ gặp phải lỗi liên kết . Bây giờ bạn có quyền truy cập vào globalStruct từ mỗi đơn vị biên dịch bao gồm mystruct.h.

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