2013-04-05 77 views
15

Tôi đã gặp khó khăn trong việc hiểu cách hoạt động của 'extern'. Tôi đã tìm kiếm trên Google nhưng dường như không có trường hợp mẫu cụ thể nào tôi đang cố gắngViệc sử dụng extern trong C++

Nếu tôi có tệp main.cpp tham chiếu one.h và trong đó tôi có danh sách có tên LIST1 (đó là một mảng kép 100 x 100) vì vậy tôi có đôi List1 [100] [100];

làm cách nào tôi có thể sử dụng danh sách này trong one.cpp?

extern double LIST1[100][100] 

không đang làm việc:/

main.cpp:

#include "one.h" 

extern double LIST1[100][100]; 

one.cpp:

void one::useList() 
{ 
for(j = 0; j < 100; j++) 
    { 
    for(i = 0; i < 100; i++) 
    { 
     LIST1[j,i] = 0.5; 
    } 
} 
} 

Đây là những gì tôi có.

Lỗi Tôi nhận:

1> main.obj: lỗi LNK2001: biểu tượng bên ngoài chưa được giải quyết "kép (* List1) [100]" (List1 @@ 3PAY0GE @ NA?)

+1

Bạn có thể nêu rõ mã bạn có trong tệp nào không. Mô tả hiện tại của bạn khá khó hiểu. – NPE

+1

và vui lòng xác định "không hoạt động" – infiniteRefactor

+0

'LIST1 [j, i] = 0.5;' cũng phải đưa ra lỗi - nghĩa là 'LIST1 [j] [i] = 0.5;' –

Trả lời

21

Trong C++, như C trước đó, mỗi tệp nguồn được biên dịch thành tệp đối tượng. Sau đó tất cả các tệp đối tượng được liên kết để tạo chương trình thực thi.

Để chia sẻ biểu tượng (chức năng, biến toàn cục), có một số từ khóa cho trình biên dịch cục bộ biết tệp, là riêng tư và được nhập từ tệp khác.

Từ khóa `extern 'có nghĩa là một biểu tượng có thể được truy cập, nhưng không được xác định. Nó nên được định nghĩa (như một toàn cầu) trong một số module khác. Nếu không, bạn sẽ gặp lỗi 'biểu tượng không xác định' tại thời gian liên kết.

29

Tuyên bố biến tại phạm vi không gian tên luôn là định nghĩa trừ khi bạn đặt extern trên đó; thì đó chỉ là một tuyên bố.

Một quy tắc quan trọng trong C++ là bạn không thể có nhiều định nghĩa đối tượng có cùng tên. Nếu tệp tiêu đề của bạn chỉ chứa double LIST1[100][100];, điều này sẽ hoạt động miễn là bạn chỉ bao gồm tệp đó trong một đơn vị dịch. Nhưng ngay sau khi bạn bao gồm tệp tiêu đề trong nhiều đơn vị dịch, bạn có nhiều định nghĩa của LIST1. Bạn đã phá vỡ quy tắc!

Vì vậy, để có biến toàn cầu có thể truy cập từ nhiều đơn vị dịch, bạn cần đảm bảo chỉ có một khai báo trong tệp tiêu đề. Chúng tôi làm điều này với extern:

extern double LIST1[100][100]; 

Tuy nhiên, bạn không thể chỉ bao gồm tiêu đề và cố gắng sử dụng đối tượng này bởi vì không có một định nghĩa được nêu ra. Tuyên bố LIST1 này chỉ nói rằng một mảng kiểu này tồn tại ở đâu đó, nhưng chúng ta thực sự cần xác định nó để tạo đối tượng.Vì vậy, trong một đơn vị dịch thuật duy nhất (một trong .cpp tập tin của bạn thường), bạn sẽ cần phải đặt:

double LIST1[100][100]; 

Bây giờ, mỗi .cpp tập tin của bạn có thể bao gồm các tập tin header và duy nhất từng được khai báo. Nó hoàn toàn tốt đẹp để có nhiều khai báo trên chương trình của bạn. Chỉ một trong số các tệp .cpp của bạn sẽ có định nghĩa này.

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