Tôi không thể hiểu tại sao điều này không hoạt động.Thứ tự `định nghĩa tĩnh` và `khai báo extern` trong một đơn vị dịch
extern int i;
int main()
{
printf(" %d ", i);
}
static int i =3;
Ngoài ra, điều này không làm việc:
extern int i;
static int i =3;
int main()
{
printf(" %d ", i);
}
Nhưng nếu static
biến được xác định trước extern declaration
nó hoạt động:
static int i =3;
extern int i;
int main()
{
printf(" %d ", i);
}
Theo tôi được biết từ extern int i
nói rằng i
là hiện tại ở một nơi khác và tại đây trông như thế nào (int i
)
Nhưng, ở một nơi khác phương tiện:
1) Có lẽ, điểm sau trong đơn vị same
dịch như một global variable
.
2) Có thể, trong một số đơn vị dịch là other
.
Tôi đã nghĩ rằng (1)
sẽ hợp lệ mặc dù static int i = 3
đã hạn chế phạm vi của i
đối với đơn vị dịch hiện tại mà nó được xác định.
Không phải là static int i =3
global
(tôi có nghĩa là ít nhất nó có thể nhìn thấy trong đơn vị dịch) ở đây mặc dù nó có phạm vi giới hạn đối với đơn vị dịch thuật của nó? Vậy tại sao trình biên dịch không thể tìm thấy nó?
Khi tôi biên dịch hai phiên bản đầu tiên tôi nhận được lỗi thời gian biên dịch sau:
error: static declaration of ‘i’ follows non-static declaration
note: previous declaration of ‘i’ was here
Tôi không thể hiểu được thông báo lỗi này. Ngoài ra, tại sao nó phàn nàn nó như là một tĩnh declaration
nó không phải là một definition
cũng?
Chính xác "không hoạt động" là gì? Nó là một vấn đề biên dịch? Vấn đề thời gian chạy? Tôi đang biên dịch mã của bạn với VS 2010 và có vẻ như nó hoạt động tốt. – Nbr44
ComIPler GCC, tôi nhận được một biên dịch lỗi thời gian khai báo tĩnh của i sau tuyên bố không tĩnh. –