2010-05-06 14 views
8

Trong C static có thể có nghĩa là biến cục bộ hoặc hàm/biến toàn cục không có liên kết bên ngoài. Trong C++ nó cũng có nghĩa là một biến thành viên của mỗi lớp hoặc hàm thành viên.Làm thế nào nó xảy ra mà "tĩnh" biểu thị một chức năng/biến mà không có liên kết bên ngoài trong C và C + +?

Có bất kỳ tham chiếu nào đến cách nó xảy ra mà từ khóa static dường như hoàn toàn không liên quan đến việc thiếu liên kết bên ngoài được sử dụng để biểu thị sự thiếu liên kết bên ngoài?

Trả lời

4

static là bộ định danh lưu trữ. Từ "tĩnh" có nghĩa là không thay đổi. "Bộ nhớ" đề cập đến vị trí của đối tượng trong bộ nhớ, tức là địa chỉ của nó.

Một đối tượng có lưu trữ static ở địa chỉ cố định.

Nó chỉ xảy ra khi một đối tượng có bộ nhớ extern cũng có địa chỉ liên tục. Do cách thức các chương trình C và C++ được liên kết, đó là một điều cần thiết. Và bởi vì extern xảy ra là hành vi ít gây ngạc nhiên nhất, nó cũng là mặc định.

Nếu bạn nghĩ về nó theo điều khoản của extern là một tính năng bổ sung trên đầu trang của static, tôi nghĩ rằng nó có ý nghĩa hơn một chút. Có một chút ngu ngốc khi khai báo hàm static, vì không có thay thế trong bất kỳ ngôn ngữ được biên dịch đầy đủ nào, nhưng địa chỉ của hàm tĩnh ngay cả khi nó không hiển thị bên ngoài.

Phần thực sự không phù hợp, sau đó, là các thành viên lớp mà được chia sẻ giữa các đơn vị biên dịch khác nhau phải được khai báo static, không extern ...

6

Sử dụng từ khóa hiện có có lợi thế là không thêm từ khóa mới vào ngôn ngữ, điều này có thể phá vỡ các chương trình hiện có. Nó có thể gây nhầm lẫn nhưng nó được coi là một loại "xấu xa".

+3

Và tĩnh có, giống như rất nhiều từ khóa C++, một ý nghĩa phụ thuộc vào ngữ cảnh. – Klaim

6

Tôi giả định rằng bạn xem xét việc sử dụng tĩnh để xác định các biến giữ giá trị của chúng giữa các hàm gọi là tự nhiên.

xem xét như sau:

void func() { 
    static int x; 
} 

so

int x; 
void func() { 
} 

Từ quan điểm func 's, x cư xử như nhau trong cả hai trường hợp. Giá trị vẫn còn giữa các cuộc gọi liên tiếp. Sự khác biệt giữa hai người là những người khác có thể thấy x. Trong lần đầu tiên, không ai có thể. Trong lần thứ hai, mọi người đều có thể.

Khái niệm đó mở rộng đến các biến tĩnh ở phạm vi toàn cầu. Nếu bạn chỉ khai báo một biến, mọi người có thể thấy nó. Nhưng nếu bạn khai báo rằng biến tĩnh, chỉ có tập tin đó mới có thể nhìn thấy nó. Rõ ràng, bạn phải cho phép thực tế là không có phạm vi bổ sung để hạn chế khả năng hiển thị, nhưng ý tưởng là ở đó.

Ý nghĩa bổ sung trong C++ liên quan đến thành viên tĩnh cũng tương tự trực tiếp với ví dụ ban đầu. Một biến duy nhất được chia sẻ bởi tất cả các phiên bản của lớp.

+0

Tôi hoàn toàn không hài lòng với từ ngữ của tôi ở đây: - Về cơ bản, những gì tôi đang cố gắng vượt qua là cả ba sử dụng về cơ bản dẫn đến một biến toàn cầu được giới hạn trong phạm vi hiện tại. –

+0

Đó là ** chính xác ** lý do. Tôi không hiểu câu trả lời ở trên (hoàn toàn vô dụng) đã nhận được nhiều phiếu bầu như thế nào! – Shahbaz

+0

Ý nghĩa của biến có nghĩa là loại bỏ một cờ lê trong phần "giới hạn phạm vi hiện tại". 'class X {public: static int foo; }; 'khai báo một' X :: foo' có thể nhìn thấy trên toàn cầu (mặc dù nó yêu cầu bộ định danh 'X ::'). – cHao

2

Phiên bản C có nghĩa là "liên kết tĩnh" bên ngoài của một hàm.

Phiên bản lớp C++ và C bên trong phiên bản hàm có nghĩa là "được lưu trữ tĩnh", nghĩa là chúng không phải là biến số auto (ngăn xếp hoặc cục bộ) hoặc biến mẫu trong lớp.

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