2011-11-14 29 views
5
#include<stdio.h> 
int x=13; // forcing space allocation 
int x; 
int main(){ 
    printf("%d\n",x); 
} 

Mã trên biên dịch nhưng mã bên dưới không biên dịch. tại sao ?Lỗi: Khai báo lại không có liên kết

#include<stdio.h> 
int main(){ 
    int x=13; // forcing space allocation 
    int x; 
    printf("%d\n",x); 
} 

tôi được thông báo rằng int x; có thể được giải thích bởi người khiếu nại như một tuyên bố hoặc định nghĩa tùy thuộc vào ngữ cảnh. tôi có thể thấy rằng trong trường hợp đầu tiên (cái toàn cục) nhưng điều gì xảy ra trong lần thứ hai.

Trả lời

4

Quoting:

Bạn không thể có hai biến toàn cục có cùng tên trong chương trình C. C có thể cho phép nhiều định nghĩa trong cùng phạm vi tệp thông qua tentative definition rule, nhưng trong mọi trường hợp, tất cả các định nghĩa sẽ tham chiếu cho cùng một biến.

+0

tôi đồng ý với những gì bạn nói. Nhưng tại sao không cùng một điều áp dụng cho các biến địa phương. Tôi điều tôi thiếu một cái gì đó rất rõ ràng. Vui lòng chỉ đúng hướng – Bazooka

+0

bạn có thể có định nghĩa dự kiến ​​chỉ cho các biến có phạm vi tệp và không cho biến cục bộ. –

0

Vì bạn không thể khai báo hai lần biến cục bộ có cùng tên. Đơn giản là đừng làm thế.

Nó hoạt động cho toàn cầu, vì trình biên dịch thấy rằng dưới dạng forward declaration, tất nhiên không thể hoạt động với các biến ngăn xếp.

Lưu ý rằng nó chỉ có thể hoạt động trên toàn cầu khi không có giá trị nào được gán.

+1

Nó hoạt động cho các biến toàn cục. Tại sao không cho các loại tự động? – Bazooka

+0

Bạn gọi một loại tự động là gì? – Macmade

+0

Xem chỉnh sửa ... – Macmade

0

Tiếp tục trên từ bình luận của bạn: "bạn có thể xin hãy giải thích trên tờ khai chuyển tiếp" ...

Chuyển tiếp tuyên bố là chính xác những gì họ âm thanh như thế nào. Một tuyên bố sẽ, ở nơi khác (thường sau này) được xác định. Khái niệm này chỉ áp dụng cho các biểu tượng toàn cục. Chỉ có thể có MỘT định nghĩa của một biểu tượng toàn cầu trong một kết quả nhị phân. Tuy nhiên, bạn có thể khai báo chúng nhiều lần trong mã nguồn để chúng có thể được tham chiếu trong giai đoạn biên dịch.

Các ký hiệu này trở thành định nghĩa trong assembly, sau đó được sử dụng để liên kết mọi thứ với nhau trong giai đoạn liên kết.

Tệp tiêu đề là một ví dụ sử dụng phổ biến của các khai báo chuyển tiếp được xác định ở nơi khác (sau này) trong mã.

Biến cục bộ (tự động) không được chuyển đổi thành biểu tượng. Vì vậy, khi bạn nói điều gì đó giống như

int x; 
int x; 

trong phạm vi tương tự, trình biên dịch không cho phép nó vì nó vô nghĩa. Biến cục bộ chỉ đơn giản là một sự thuận tiện để trỏ đến một vị trí cụ thể trong khung ngăn xếp của hàm. Ranh giới định nghĩa của chúng nằm trong phạm vi đánh dấu phạm vi {}.

Tệp tiêu đề thực chất là "các khai báo chuyển tiếp" của các biến và chức năng toàn cầu; để thấy điều này cho bạn như trong struct foo;.

Nếu bạn muốn xem lỗi nguyên nhân định nghĩa toàn cầu, hãy thử. int x = 10;int x = 11; là toàn cầu và bạn sẽ thấy trình biên dịch tạo ra lỗi cho hiệu ứng "redifintion of x".

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