2010-02-16 31 views
48

Nếu tôi có tệp C như dưới đây, sự khác nhau giữa ij là gì?Tĩnh so với toàn cầu

#include <stdio.h> 
#include <stdlib.h> 

static int i; 
int j; 

int main() 
{ 
    //Some implementation 
} 
+1

Đọc câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/1358400/what-is-external-linkage-and-internal-linkage-in-c – avakar

+0

[Sự khác biệt giữa biến tĩnh, tự động, toàn cục và cục bộ trong ngữ cảnh của c và C++] (https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-ca) –

Trả lời

44

i có liên kết nội bộ để bạn không thể sử dụng tên i trong các tệp nguồn khác (đơn vị dịch thuật nghiêm ngặt) để tham chiếu đến cùng một đối tượng.

j có liên kết bên ngoài để bạn có thể sử dụng j để tham chiếu đến đối tượng này nếu bạn khai báo nó extern trong một đơn vị dịch thuật khác.

+7

Có sự khác biệt về hiệu suất nào không? – ma11hew28

+0

không nên có sự khác biệt thời gian chạy nếu bạn đang làm điều tương tự, vì trình biên dịch có thể tạo cùng một mã. Biên dịch có thể hơi dài hơn với toàn cầu mặc dù, vì nó có phạm vi rộng hơn. –

17

i không hiển thị bên ngoài mô-đun; j có thể truy cập toàn cầu.

Đó là, một mô-đun, được liên kết với nó, có thể làm

extern int j; 

và sau đó có thể đọc và ghi các giá trị trong j. Cùng một mô-đun khác không thể truy cập i, nhưng có thể khai báo cá thể riêng của nó, thậm chí là mô-đun toàn cầu — không hiển thị với mô-đun đầu tiên.

+1

khai báo 'extern' cần thiết? –

+1

Nó phụ thuộc vào việc thực hiện. Việc sử dụng 'extern' được đảm bảo không gây rắc rối, miễn là một mô-đun có ký hiệu là non -exex' và public (phân bổ nó). Các triển khai Unix ban đầu đã hợp nhất các biểu tượng có cùng tên — giống như một Fortran phổ biến — do đó, 'extern' không được yêu cầu. – wallyk

+1

Lưu ý rằng "Không hiển thị" không có nghĩa là nó nằm ngoài phạm vi. Điều đó có nghĩa là nếu bạn khai báo một i trong một đơn vị biên dịch khác và bạn sẽ loại bỏ i tĩnh khỏi tệp .c của bạn, toàn bộ i sẽ được hiển thị cho tệp .c của bạn. Ngược lại, nếu i toàn cầu nằm ngoài phạm vi, nó sẽ không thành vấn đề nếu bạn có một static tôi khai báo trong tệp .c của bạn. Toàn cầu sẽ không bao giờ được nhìn thấy. static i ưu tiên hơn một global i được định nghĩa trong một đơn vị biên dịch khác được gọi là 'shadowing'. Nó cũng xảy ra với các hàm địa phương và không phải là một điều C++/c-only. – Jupiter

4

Sự khác biệt là i có liên kết nội bộ và j có liên kết bên ngoài. Điều này có nghĩa là bạn có thể truy cập j từ các tệp khác mà bạn liên kết với, trong khi i chỉ có sẵn trong tệp nơi tệp được khai báo.

3

i sẽ có liên kết tĩnh, tức là, chỉ có thể truy cập vào tệp hiện tại.

j cần được xác định như extern, đó là

extern int j; 

trong một tập tin tiêu đề (.h), và sau đó nó sẽ có liên kết bên ngoài, và có thể được truy cập qua các tập tin.

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