2011-10-18 3 views
5

thấy trong một mã nguồn dự án tôi đã thấy belows khailợi thế của chức năng tĩnh là gì?

static int *foo(); 

để nó tuyên bố foo như chức năng tĩnh trở về con trỏ đến int. Vì vậy, ở đây tôi wana hỏi bạn whats mục đích khai báo chức năng như tĩnh?

+0

lol @James: 'static double *** bzzzt();' – pmg

Trả lời

9

Tên của hàm không hiển thị bên ngoài đơn vị dịch (tệp nguồn) mà nó được khai báo và sẽ không xung đột với chức năng khác foo trong tệp nguồn khác.

Nói chung, các hàm có thể được khai báo là static trừ khi bạn có nhu cầu cụ thể để gọi nó từ một tệp nguồn khác.

(Lưu ý rằng nó chỉ tên đó là không nhìn thấy được. Nó vẫn có thể được gọi từ bất cứ nơi nào trong chương trình thông qua một con trỏ.)

+0

Tôi có thể gọi bằng con trỏ bằng cách nào? –

+0

@ Mr.32 Tìm kiếm "con trỏ hàm". – cnicutar

+1

Sự khác biệt giữa việc đánh dấu một hàm là tĩnh và đơn giản là không bao gồm hàm đó trong tiêu đề là gì? Sẽ không bỏ qua nó từ tiêu đề có tác dụng tương tự? Hoặc, có một lý do để không đặt một cái gì đó trong tiêu đề và cũng không đánh dấu nó là tĩnh? – Alex

2

Ngăn chặn các đơn vị dịch (.c files) khác nhìn thấy hàm. Giữ mọi thứ sạch sẽ và gọn gàng. Một hàm không có staticextern theo mặc định (hiển thị với các mô-đun khác).

+0

không nhận được ..... –

+0

@JamesMcNellis Edited. – cnicutar

1

Khai báo chức năng là static ngăn các tệp khác truy cập vào nó. Nói cách khác, nó chỉ hiển thị đối với tệp được khai báo; một hàm "cục bộ".

Bạn cũng có thể liên kết static (từ khóa khai báo hàm, không biến) trong C dưới dạng private trong ngôn ngữ hướng đối tượng.

Xem here để biết ví dụ.

+1

Câu hỏi là về [tag: c]. "Lớp" là gì? –

+0

Tôi quan tâm nhiều hơn đến c ... tôi không biết lớp & C++ –

+1

@Keith: Xin lỗi - đã được mã hóa chỉ trong Java trong tháng qua. –

1

Đánh dấu một chức năng hoặc một biến toàn cầu như static làm cho nó vô hình đến linker một khi đơn vị dịch hiện tại được biên dịch thành một tệp đối tượng.

Nói cách khác, nó chỉ có liên kết nội bộ trong đơn vị dịch hiện tại. Khi không sử dụng static hoặc sử dụng rõ ràng thông số kỹ thuật của lớp lưu trữ extern, biểu tượng có liên kết bên ngoài.

2

Từ tiêu chuẩn C99:

6.2.2 Mối quan hệ của ers fi identi

Nếu tuyên bố của một fi le phạm vi identi fi er cho một đối tượng hoặc một hàm chứa các lưu trữ hạng Speci fi er tĩnh, identi fi er có liên kết nội bộ.

Trong bộ của các đơn vị dịch và các thư viện đó được hiểu là toàn bộ chương trình, mỗi tuyên bố một er fi identi đặc biệt với mối liên hệ bên ngoài biểu thị cùng một đối tượng hoặc chức năng. Trong một đơn vị dịch thuật, mỗi tờ khai có xác định với nội bộ liên kết biểu thị cùng một đối tượng hoặc chức năng. Mỗi tuyên bố của một định danh với không có liên kết biểu thị một thực thể duy nhất.