2009-11-03 52 views

Trả lời

18

Có một vài lý do để sử dụng static trong C.

Khi sử dụng với chức năng, có mục đích là để tạo trừu tượng. Thuật ngữ gốc cho phạm vi của tệp mã nguồn C là "đơn vị dịch". Chỉ có thể truy cập các chức năng tĩnh từ trong cùng một đơn vị dịch. Các hàm tĩnh này tương tự như các phương thức riêng trong C++, được giải thích một cách tự do (trong tương tự, một đơn vị dịch xác định một lớp).

Dữ liệu tĩnh ở mức toàn cầu cũng không thể truy cập từ bên ngoài đơn vị dịch và điều này cũng được sử dụng để tạo trừu tượng. Ngoài ra, tất cả dữ liệu tĩnh được khởi tạo về 0, do đó, static có thể được sử dụng để kiểm soát khởi tạo.

Tĩnh ở mức biến cục bộ ("tự động") được sử dụng để trừu tượng việc triển khai chức năng duy trì trạng thái qua các cuộc gọi, nhưng tránh sử dụng biến tại phạm vi đơn vị dịch. Một lần nữa, các biến được khởi tạo bằng 0 do trình độ tĩnh.

8

Từ khóa tĩnh có nhiều cách sử dụng; Bên ngoài một hàm, nó đơn giản giới hạn khả năng hiển thị của một hàm hoặc biến đối với đơn vị biên dịch (tệp .c) hàm hoặc biến xảy ra. Bằng cách đó hàm hoặc biến không trở thành toàn cầu. Đây là một điều tốt, nó thúc đẩy một loại nguyên tắc "cần biết" (không phơi bày những thứ không cần phải tiếp xúc). Các biến tĩnh của kiểu này không được khởi tạo, nhưng tất nhiên các biến toàn cục cũng không được khởi tạo, vì vậy từ khóa tĩnh không chịu trách nhiệm khởi tạo zero cho mỗi lần.

Biến cũng có thể được khai báo tĩnh bên trong một hàm. Tính năng này có nghĩa là biến không tự động, tức là được phân bổ và được giải phóng trên ngăn xếp với mỗi lần gọi hàm. Thay vào đó biến được phân bổ trong vùng dữ liệu tĩnh, nó được khởi tạo bằng 0 và tồn tại trong suốt thời gian của chương trình. Nếu hàm sửa đổi nó trong một lần gọi, giá trị sửa đổi mới sẽ có sẵn tại lời gọi tiếp theo. Điều này nghe có vẻ giống như một điều tốt, nhưng có những lý do tốt "tự động" là mặc định, và "tĩnh" biến trong các chức năng nên được sử dụng một cách tiết kiệm. Tóm lại, các biến tự động có nhiều bộ nhớ hiệu quả hơn và rất cần thiết nếu bạn muốn chức năng của mình là luồng an toàn.

6

static được sử dụng làm cả số storage class specifierlinkage specifier. Là một trình chỉ định liên kết, nó chỉ hạn chế phạm vi của một biến hoặc hàm toàn cục khác đối với một đơn vị biên dịch đơn lẻ. Điều này cho phép, ví dụ một đơn vị biên dịch có các biến và hàm có cùng tên định danh như các đơn vị biên dịch khác nhưng không gây ra xung đột, vì các mã định danh này bị 'ẩn' khỏi trình liên kết. Điều này rất hữu ích nếu bạn đang tạo một thư viện ví dụ và cần các hàm 'helper' nội bộ không được gây ra xung đột với mã người dùng.

Là bộ định dạng lớp lưu trữ được áp dụng cho biến cục bộ, nó có ngữ nghĩa khác nhau hoàn toàn, nhưng câu hỏi của bạn dường như ngụ ý rằng bạn đang đề cập đến liên kết tĩnh.

0

chức năng tĩnh trong C

Trong C, chức năng toàn cầu theo mặc định. Từ khóa “tĩnh” trước tên hàm làm cho nó tĩnh. Ví dụ, hàm fun() dưới đây là tĩnh.

static int fun(void) 
{ 
    printf("I am a static function "); 
} 

Không giống như chức năng toàn cầu trong C, quyền truy cập vào các chức năng tĩnh bị giới hạn ở tệp mà chúng được khai báo.Do đó, khi chúng ta muốn hạn chế quyền truy cập vào các hàm, chúng ta làm cho chúng tĩnh. Một lý do khác để làm cho hàm tĩnh có thể tái sử dụng cùng tên hàm trong các tệp khác.

Ví dụ, nếu chúng ta lưu trữ sau chương trình trong một tập tin file1.c

/* Inside file1.c */ 
static void fun1(void) 
{ 
    puts("fun1 called"); 
} 

Và cửa hàng chương trình sau đây trong một tập tin file2.c

/* Iinside file2.c */ 
int main(void) 
{ 
    fun1(); 
    getchar(); 
    return 0; 
} 

Bây giờ, nếu chúng ta biên dịch mã trên với lệnh "gcc file2.c file1.c", chúng tôi nhận được lỗi "không xác định tham chiếu đến fun1’” . This is because fun1() is declared tĩnh` trong tệp1.c và không thể được sử dụng trong tệp2.c. Xem thêm explanation here, nơi mã nguồn đến.

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