Ngữ nghĩa nội tuyến C99 thường bị hiểu lầm. Trình chỉ định inline
phục vụ hai mục đích:
Đầu tiên, làm gợi ý trình biên dịch trong trường hợp khai báo static inline
và extern inline
. Ngữ nghĩa vẫn không thay đổi nếu bạn loại bỏ các specifier.
Thứ hai, trong trường hợp nguyên inline
(nghĩa là không có static
hoặc extern
) để cung cấp định nghĩa nội tuyến thay thế cho định dạng bên ngoài, phải có mặt trong một đơn vị dịch khác. Không cung cấp một hành vi bên ngoài là hành vi không xác định, mà thường sẽ biểu hiện như liên kết thất bại.
Điều này đặc biệt hữu ích nếu bạn muốn đặt hàm vào thư viện được chia sẻ, nhưng cũng làm cho nội dung chức năng có sẵn để tối ưu hóa (ví dụ như nội tuyến hoặc chuyên môn hóa). Giả sử một trình biên dịch đủ thông minh, điều này cho phép bạn khôi phục nhiều lợi ích của các mẫu C++ mà không cần phải nhảy qua các vòng tiền xử lý trước.
Lưu ý rằng có một chút lộn xộn hơn tôi đã mô tả ở đây vì có khai báo ngoài nội tuyến phạm vi tệp khác sẽ kích hoạt trường hợp đầu tiên như được mô tả trong câu trả lời của Jens, ngay cả khi định nghĩa đó là inline
thay vì extern inline
. Điều này là do thiết kế, do đó bạn có thể có một định nghĩa nội tuyến đơn trong một tệp tiêu đề, mà bạn có thể đưa vào tệp nguồn cung cấp tệp bên ngoài bằng cách thêm một dòng cho khai báo bên ngoài.
Hoặc làm cho nó 'tĩnh' hoặc cung cấp định nghĩa không nội tuyến mà trình liên kết có thể tìm thấy. –
Xem thêm http://stackoverflow.com/questions/6312597 – Jens