2010-10-06 22 views
8

Tôi đang làm việc trên một số mã tôi đã không viết và nhận thấy rằng có rất nhiều extern void my_func();.Tại sao bạn sử dụng `extern void my_func();` thay vì bao gồm `my_utils.h`?

Sự hiểu biết của tôi là extern đối với các biến toàn cục, không phải cho các hàm.

Có lý do thực tế nào để khai báo hàm là extern thay vì đặt nó vào tệp tiêu đề và bao gồm không? Hay đây chỉ là một sự lựa chọn phong cách?

Trả lời

9

Điều này chỉ cần thiết nếu vì một lý do nào đó, tệp tiêu đề không khai báo hàm. Và extern luôn không cần thiết cho các chức năng, vì các hàm luôn là extern theo mặc định.

+0

luôn được đặt bên ngoài theo mặc định trong C? bạn có chắc không?? – Donotalo

+0

@Donotalo: Khá chắc chắn, nhưng đó là nửa đêm, vì vậy ai biết được những gì mệt mỏi đã làm cho bộ não của tôi. –

+0

Tôi đang làm việc cho bộ điều khiển vi mô trong 2 năm. trình biên dịch tôi sử dụng là C. mặc dù không hoàn toàn ANSI C, và nhiều tính năng của C99 vắng mặt, nhưng để gọi một hàm không tĩnh được định nghĩa trong một tệp khác, chúng ta cần 'extern' nguyên mẫu của nó hoặc bao gồm tiêu đề. – Donotalo

-3

Một sử dụng extern chức năng là giả sử bạn có hai mô-đun: module_a (thực hiện trong module_a.hmodule_a.c files), module_b (thực hiện trong module_b.hmodule_b.c tập tin). Bây giờ bạn muốn có một hàm cụ thể của module_b để sử dụng trong module_a. Nhưng bạn không muốn để lộ tất cả các chức năng của module_b vào module_a. Vì vậy, trường hợp đó thay vì #include "module_b.h" bạn chỉ có thể extern nguyên mẫu hàm bắt buộc.

+0

Như đã thảo luận trong phần bình luận cho câu trả lời của tôi, việc sử dụng 'extern' là không cần thiết. –

+0

@Oli: Tôi vừa thử nghiệm tính năng này bằng cách sử dụng VS2008. Nó không hoạt động ngoại trừ 'extern'. Bất kỳ ý tưởng tại sao? Tôi có 3 tập tin: main.cpp (chứa main()), functions.h và functions.cpp. function.cpp định nghĩa một hàm (có tên là fun()) mà chỉ trả về 0. từ main(), tôi gọi là 'cout << fun() << endl;' compiler nói fun() không khai báo. sau đó tôi đã viết 'extern int fun();' trước main(). sau đó nó hoạt động. – Donotalo

+0

Nó cũng sẽ làm việc chỉ đơn giản là 'int fun();'. –

-3

Không đủ để khai báo mẫu thử nghiệm trong tệp * .c của bạn trước khi sử dụng hàm, thay vì bao gồm toàn bộ tệp tiêu đề? Không cần phải sử dụng extern trong mọi trường hợp cho các chức năng. Tôi đã không thử nhưng nó giả sử để làm việc theo cách đó. Các hàm

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