2011-01-18 34 views
20

Có sử dụng để gắn cờ biến là static, khi nó nằm trong phạm vi toàn cầu của tệp .cpp, không phải trong một hàm?Sử dụng các biến và hàm tĩnh trong phạm vi toàn cầu

Bạn cũng có thể sử dụng từ khóa tĩnh cho các chức năng không? Nếu có, sử dụng của họ là gì?

+2

Âm thanh như bài tập về nhà –

+27

Có vẻ như ai đó đang gọi bất kỳ bài tập về nhà nào –

Trả lời

14

Trong trường hợp này, từ khóa tĩnh nghĩa là hàm hoặc biến chỉ có thể được sử dụng bởi mã trong cùng một tệp cpp. Biểu tượng được liên kết sẽ không được xuất và sẽ không thể sử dụng được bởi các mô-đun khác.

Đây là thực tiễn tốt để tránh xung đột tên trong phần mềm lớn khi bạn biết các hàm hoặc biến toàn cầu của bạn không cần thiết trong các mô-đun khác.

+11

Trong C++, bạn nên sử dụng các không gian tên chưa đặt tên. –

16

Có, nếu bạn muốn khai báo biến phạm vi tệp, thì static là cần thiết. Các biến số static được khai báo trong một đơn vị dịch thuật không thể được chuyển từ một đơn vị dịch thuật khác.


Bằng cách này, việc sử dụng từ khóa static không được dùng nữa trong C++ 03.

Phần $ 7.3.1.1/2 từ ++ chuẩn C (2003) lần đọc,

Việc sử dụng các từ khóa tĩnh là bị phản đối khi tuyên bố đối tượng trong một phạm vi namespace; không gian tên không gian tên cung cấp một thay thế cao cấp .

C++ ưu tiên Không được đặt tên không gian tên trên static từ khóa. Xem chủ đề này:

Superiority of unnamed namespace over static?

+6

Và bản nháp C++ 0x mới nhất không được chấp nhận. –

+2

@Fred: thật thú vị !! – Nawaz

+0

@Fred: vui, thay đổi giữa n3092 và n3225, bạn có biết điều gì đã thúc đẩy sự thay đổi này? –

1

Lấy làm ví dụ -

// At global scope 
int globalVar; // Equivalent to static int globalVar; 
       // They share the same scope 
       // Static variables are guaranteed to be initialized to zero even though 
       // you don't explicitly initialize them. 


// At function/local scope 

void foo() 
{ 
    static int staticVar ; // staticVar retains it's value during various function 
          // function calls to foo();     
} 

Cả hai đều không còn tồn tại chỉ khi chương trình chấm dứt/thoát.

+0

Nhưng chức năng biến tĩnh scoped có được khởi tạo trong thời gian chạy hoặc chỉ khi chức năng phạm vi của nó, trong trường hợp này foo() được chạy? –

+0

@Mahesh Không phải là toàn cầuVar không tĩnh nếu bạn không chỉ định tĩnh theo mặc định? Tôi nghĩ rằng người ta có thể dễ dàng mở rộng các biến toàn cục không tĩnh. – starkk92

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