2011-02-04 58 views

Trả lời

11

Vâng, dự đoán của bạn là chính xác. Nó tuyên bố sự tồn tại của hàm abc(), vì vậy nó có thể được tham chiếu trong phạm vi xyz(). Lưu ý rằng extern là không cần thiết, vì các hàm theo mặc định là extern.

+3

Tôi sẽ không gọi extern không cần thiết. Người ta có thể nói rằng viết extern trước khi một nguyên mẫu là đúng ngữ pháp-khôn ngoan, thay vì có nó có ngầm. Cá nhân tôi luôn viết extern trước nguyên mẫu, bởi vì điều đó mang lại cho tôi thói quen luôn viết * cái gì đó * trước họ. Bằng cách đó tôi sẽ không quên viết tĩnh trước các hàm cần được đóng gói riêng. – Lundin

+4

@Lundin: Bạn có viết 'auto' trước tất cả các biến cục bộ không? –

+0

nhưng tại sao tuyên bố sự tồn tại trong một hàm và không phải trong tệp trực tiếp (ví dụ: trước định nghĩa của từng hàm). Hoặc là nó để kích hoạt các tham chiếu đến một thời điểm xác định và không phải trong quá trình biên dịch? – binaryguy

2

Tuyên bố "bên ngoài" trong C là để chỉ ra sự tồn tại của và loại, một biến toàn cục hoặc hàm.

Extern là thứ được định nghĩa bên ngoài cho mô-đun hiện tại.

Việc tìm các nguyên mẫu chức năng được khai báo là extern cũng không phổ biến.

Bạn chỉ cần nó ở nơi không phải là mặc định và/hoặc nơi bạn muốn chỉ định liên kết "C".

0

Có tuyên bố của bạn là đúng ..... khi chúng tôi sử dụng extern func_name w đang khai báo func_name.

0

Tôi chỉ thêm rằng cấu trúc này, theo kinh nghiệm của tôi, không phổ biến trong mã hiện đại, nhưng thường thấy trong mã cũ hơn, đặc biệt là mã "K & R".

Mã hiện đại hơn thường sẽ lấy mẫu thử nghiệm hàm từ tệp tiêu đề.

2

Bằng cách này khai báo có một lợi thế lớn:

Nếu chỉ có một hoặc ít chức năng đang kêu gọi một chức năng bên ngoài, tuyên bố này có ý nghĩa đặc biệt trong một file nguồn lớn. Nếu việc tái cấu trúc mã sau (chức năng di chuyển trong một tệp khác) phải được thực hiện, thì việc xem phụ thuộc dễ dàng hơn nhiều so với thêm các phần tử bên ngoài trên phạm vi toàn cục (tệp). Trong trường hợp thứ hai, xác suất "quên" các phần tử bên ngoài như vậy trong tệp càng cao. Ngược lại bằng cách khai báo nó trong phạm vi chức năng, khai báo sẽ di chuyển cùng với hàm ...

Tôi cũng có xu hướng làm như vậy cho các biến toàn cầu bên ngoài - lợi ích đến sau khi duy trì và cuối cùng tái cơ cấu/giảm thiểu phụ thuộc.

Một lưu ý cuối cùng cho chủ đề "viết bên ngoài/không bên ngoài": Nếu nó chỉ là một khai báo chuyển tiếp (-> hàm được xác định ở cuối cùng một tệp), tôi sẽ không khuyên bạn sử dụng bên ngoài - bởi vì nó đơn giản là không phải vậy. Nếu không, bên ngoài có ý nghĩa tuyệt đối để chỉ ra rằng định nghĩa phải được tìm thấy ở nơi khác (hoặc đối với libaries: có thể cần được người dùng của thư viện đó thực hiện).

Hy vọng điều này sẽ giúp (như một bước cho một phong cách lập trình hướng khách quan hơn .. :))