2009-08-25 41 views
14

Tôi bắt đầu đặt câu hỏi về tính hữu ích của từ khóa "extern" được sử dụng để truy cập các biến/hàm trong các mô-đun khác (trong các tệp khác). Chúng ta không làm điều tương tự khi chúng ta đang sử dụng #include preprocessor để nhập một tệp tiêu đề với các biến/hàm nguyên mẫu hoặc định nghĩa hàm/biến?Sự khác nhau giữa việc sử dụng tệp extern và #including header là gì?

Trả lời

17

extern là cần thiết vì nó tuyên bố rằng biểu tượng tồn tại và thuộc một loại nhất định và không phân bổ dung lượng lưu trữ cho nó.

Nếu bạn làm:

int foo; 

Trong một tập tin header được chia sẻ giữa nhiều file nguồn, bạn sẽ nhận được một lỗi mối liên kết bởi vì mỗi nguồn sẽ có bản sao riêng của mình foo tạo và các mối liên kết sẽ không thể để giải quyết biểu tượng.

Thay vào đó, nếu bạn có:

extern int foo; 

Trong phần đầu, nó sẽ khai báo một biểu tượng được định nghĩa ở đâu đó trong mỗi tập tin nguồn.

One (và chỉ một) file nguồn sẽ chứa

int foo; 

mà tạo ra một trường hợp duy nhất của foo cho mối liên kết để giải quyết.

+2

Nhưng bạn vẫn không thể truy cập int foo mà không khai báo với extern int foo miễn là bạn bao gồm tệp tiêu đề chứa định nghĩa của nó? –

+2

Như jcopenha đã đề cập, #include chỉ chèn văn bản từ tệp được bao gồm vào tệp nguồn - trình biên dịch không thực sự nhận thức được tệp bao gồm và không xử lý chúng đặc biệt. Vì vậy, nếu bạn có A.c, B.c, và C.c, mỗi người có "int foo" và bạn liên kết chúng với nhau, làm thế nào để bạn giải quyết foo? Nó tồn tại ở 3 nơi khác nhau. extern chỉ có nghĩa là, biểu tượng tồn tại ở một nơi khác. Bạn có thể sử dụng nó, nhưng ai đó có trách nhiệm tạo ra nó. – Michael

+0

Bạn sẽ thấy rằng đối với các hàm chỉ có một thể hiện của các chương trình foo_fun() với các mô-đun gọi foo_fun() sẽ làm việc có hoặc không có extern. Vì vậy, trong những trường hợp đó, bạn nên cố gắng rõ ràng về nó. Khi bạn nhận được vào một biến toàn cầu được chia sẻ, bạn cần phải thực sự rõ ràng, một số trình biên dịch con số nó ra, một số thì không. –

2

No. #include là lệnh tiền xử lý cho biết "đặt tất cả văn bản từ tệp khác ngay tại đây". Vì vậy, tất cả các hàm và biến trong tệp được bao gồm được xác định trong tệp hiện tại.

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