2010-03-07 41 views
6

Trong C: Tại sao chỉ có các hàm nội tuyến có liên kết nội bộ (tức là khai báo với tĩnh) có thể tham chiếu (tức là sao chép địa chỉ, đọc, ghi hoặc gọi) một biến hoặc hàm tại phạm vi tệp với thời gian lưu trữ tĩnh. có thể không?Chức năng nội tuyến có liên kết nội bộ?

Trả lời

4

Đây là cách mọi thứ được xác định.

Chức năng nội tuyến sẽ được chèn vào trong mô-đun nơi nó được gọi. Vì vậy, nó không thể truy cập vào các công cụ riêng tư trong mô-đun của nó, nơi nó được xác định.

Nếu hàm được gạch chân là chỉ được sử dụng trong mô-đun đó (liên kết nội bộ). Sau đó, an toàn để cấp cho nó quyền truy cập vào nội dung "riêng tư" của mô-đun đó.

2

Một đối tượng hoặc chức năng có phạm vi tệp, được khai báo với bộ định danh bộ nhớ "tĩnh" có liên kết nội bộ. Trong khi tuổi thọ của nó là toàn bộ việc thực hiện chương trình, một đối tượng có liên kết nội bộ không được khai báo (có thể nhìn thấy từ) các đơn vị dịch thuật khác.

Đối với một hàm nội tuyến với mối liên hệ bên ngoài, trình biên dịch có thể:

  • gọi các dụ trong đơn vị dịch trong đó hàm được khai báo
  • thực hiện một thay inline tại thời điểm cuộc gọi
  • tạo một ví dụ giống hệt nhau của hàm trong đơn vị dịch thuật gọi điện

Trong hai trường hợp cuối cùng, các đối tượng có liên kết nội bộ sẽ không hiển thị. Do đó, một hàm nội tuyến có liên kết bên ngoài không thể tham chiếu đến số nhận dạng có liên kết nội bộ.

Hơn nữa, nó "không chứa định nghĩa của đối tượng có thể sửa đổi với thời gian lưu trữ tĩnh" vì điều này có thể dẫn đến nhiều trường hợp đối tượng đó có thể không phải là hành vi dự định.

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