Tôi hiểu những gì tĩnh, nhưng không phải lý do tại sao chúng tôi sử dụng nó. Là nó chỉ để giữ cho lớp trừu tượng?Tại sao phải khai báo biến hoặc hàm tĩnh trong C?
Trả lời
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.
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.
static
được sử dụng làm cả số storage class specifier và linkage 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.
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.
- 1. chuyển tiếp khai báo hàm tĩnh C++
- 2. tại sao hằng số java được khai báo là tĩnh?
- 3. Tại sao con trỏ C++ liên kết với biến được khai báo chứ không phải kiểu?
- 4. Trong hàm mẫu C++, tại sao gọi hàm phụ thuộc cho lỗi "không khai báo"?
- 5. Khi nào và tại sao phải khai báo biến thành viên trên heap C++
- 6. Tại sao mã C++ phải được chứa trong các hàm?
- 7. Tại sao lại khai báo một hàm trong chính?
- 8. C: Khai báo con trỏ biến động thành hàm
- 9. C++/CLI, hàm tạo tĩnh bên ngoài khai báo lớp
- 10. khai báo biến trong hàm sql
- 11. ios - Cách khai báo biến tĩnh?
- 12. Tại sao WebMethod được khai báo là Tĩnh?
- 13. C khai báo hàm
- 14. Biến tĩnh trong C++
- 15. Tại sao khai báo các lớp tĩnh như niêm phong và trừu tượng trong C#?
- 16. khai báo tĩnh của m sau khai báo không tĩnh
- 17. Tại sao phải khai báo loại biến PHP trong một nhận xét?
- 18. Việc sử dụng khai báo một biến tĩnh như extern bên trong một hàm là gì?
- 19. Tại sao tôi phải khai báo lại các hàm bị ghi đè trong các lớp dẫn xuất trong C++?
- 20. C++ * vs & trong khai báo hàm
- 21. C++ khai báo biến
- 22. Khai báo hàm C trong K & R
- 23. PHP - tại sao tôi không thể khai báo biến const tĩnh?
- 24. Tại sao không phải là phải khai báo một biến trong Javascript trước khi sử dụng nó?
- 25. Tại sao các tên đối số hàm không quan trọng trong khai báo C++?
- 26. Trong Java, có phải các biến được khai báo bên trong các phương thức tĩnh là tĩnh không?
- 27. Các khai báo biến tĩnh khác nhau trong Objective-C như thế nào?
- 28. biến tĩnh trong c
- 29. ASP.NET C# Phải khai báo biến vô hướng
- 30. Phải khai báo biến bảng @table
Sao chép http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program –