2012-04-13 32 views
9

Tôi vừa duyệt qua các tệp nguồn gcc. Trong gcc.c, tôi thấy cái gì đó nhưtuyên bố từ bên ngoài và định nghĩa hàm cả trong cùng một tệp

extern int main (int, char **); 

int 
main (int argc, char **argv) 
{ 

Bây giờ nghi ngờ của tôi là extern là để nói với trình biên dịch rằng chức năng đặc biệt không có trong tập tin này nhưng sẽ được tìm thấy ở một nơi khác trong dự án. Nhưng ở đây, định nghĩa của main là ngay sau khi khai báo extern. Mục đích của việc khai báo extern là gì?

Nó có vẻ như, trong ví dụ cụ thể này, extern dường như được cư xử như export mà chúng tôi sử dụng trong lắp ráp, wherin chúng tôi xuất khẩu một biểu tượng đặc biệt bên ngoài của các mô-đun

Bất kỳ ý tưởng?

Trả lời

13

Bạn đang hiểu nhầm các extern - nó không cho trình biên dịch định nghĩa là trong khác tập tin, nó chỉ đơn giản tuyên bố rằng nó tồn tại mà không cần định nghĩa nó. Hoàn toàn ổn định khi được xác định trong cùng một tệp.

C có khái niệm khai báo (tuyên bố rằng một cái gì đó tồn tại mà không cần xác định nó) và định nghĩa (thực sự đưa nó vào sự tồn tại). Bạn có thể khai báo điều gì đó thường xuyên như bạn muốn nhưng chỉ có thể xác định nó một lần.

Do chức năng có liên kết bên ngoài theo mặc định, từ khóa extern không liên quan trong trường hợp này.

0

Các cảnh báo có khả năng đề xuất nguyên mẫu hàm bị thiếu. Đó là tất cả.

6

Các hàm ngoại lệ hoàn toàn trong C. Bao gồm extern chỉ là lời nhắc trực quan. Lưu ý phụ, để tạo một hàm không phải là bên ngoài, bạn có thể sử dụng từ khóa static.

+0

Yup. Sử dụng extern khi làm một cái gì đó không chuẩn. – Barry

0

Định nghĩa của main chức năng:

int main(int argc, char **argv) { ... } 

đã tuyên bố là cú pháp prototyped của hàm main với mối liên hệ bên ngoài. Điều này có nghĩa là khai báo kiểu mẫu với extern ngay trước định nghĩa main là không cần thiết.

2

Trong khai báo hàm, extern chỉ đơn giản tuyên bố rằng hàm có liên kết bên ngoài, là mặc định; từ khóa extern hoàn toàn vô dụng trong ngữ cảnh này và hiệu ứng giống hệt với tuyên bố/mẫu thử thông thường mà không có từ khóa extern.

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