2009-07-30 80 views
79

Ưu điểm của việc khai báo trong tệp .inl là gì? Khi nào tôi cần phải sử dụng như vậy?Ý nghĩa của tệp .inl trong C++

+2

FWIW, tôi ghét các tệp .inl. Tại sao phải chia nhỏ mã của bạn hơn mức cần thiết? – Shog9

+9

@ shog9: Để phân tách giao diện khỏi triển khai. Tôi đã luôn ghét C# và tệp Java vì nó rất khó đọc giao diện vì tất cả các chi tiết triển khai messey. –

+7

@Martin - thật không may C++ cho chúng ta một sự kết hợp tồi tệ của cả hai thế giới - giao diện và một phần của việc triển khai trong phần đầu, phần còn lại của việc triển khai trong tệp .cpp. Thậm chí nếu bạn tránh các hàm inline (hoặc đặt chúng trong các tệp .inl), bạn phải làm lộn xộn giao diện với các chi tiết pesky của các thành viên riêng trừ khi bạn có thể sử dụng thành ngữ pimpl một cách tôn giáo. –

Trả lời

99

.inl file không bao giờ bắt buộc và không có ý nghĩa đặc biệt để trình biên dịch. Nó chỉ là một cách để cấu trúc mã của bạn cung cấp một gợi ý cho con người có thể đọc nó.

tôi sử dụng .inl tập tin trong hai trường hợp:

  • Đối với định nghĩa của chức năng nội tuyến.
  • Để biết định nghĩa về mẫu chức năng.

Trong cả hai trường hợp, tôi đặt tờ khai của các chức năng trong một tập tin tiêu đề, được bao gồm các tập tin khác, sau đó tôi #include file .inl ở dưới cùng của file header.

Tôi thích nó vì nó tách giao diện khỏi triển khai và làm cho tệp tiêu đề dễ đọc hơn một chút. Nếu bạn quan tâm đến chi tiết triển khai, bạn có thể mở tệp .inl và đọc nó. Nếu không, bạn không phải làm vậy.

+1

Thật vậy, nó chủ yếu là về tách giao diện từ thực hiện. –

+0

Tôi cũng đã thấy .ipp và .ixx được sử dụng cho các định nghĩa nội tuyến và .tpp và .txx cho mẫu một. – AProgrammer

+0

Ví dụ: Thư viện GNU Standard C++ sử dụng '.tcc' cho tệp triển khai mẫu. – musiphil

3

Theo kinh nghiệm của tôi, các tệp .inl được sử dụng để xác định các hàm nội dòng. Khi họ đang ở trong một tập tin .inl, tập tin có thể được bao gồm trong một tiêu đề để có được chức năng nội tuyến và trong một tập tin .c để có được định nghĩa chức năng thường xuyên.

Bằng cách này, cùng một nguồn có thể dễ dàng làm việc với các trình biên dịch không có chức năng hỗ trợ nội tuyến cũng như các trình biên dịch thực hiện.

Chúng thường được sử dụng với mã C thẳng, không thường với mã C++ vì tất cả các trình biên dịch C++ đều hỗ trợ các hàm nội tuyến.

+0

Tôi không thấy điểm trong việc thực hiện điều này chỉ để nhận được sự hỗ trợ của C. Đối với C, bạn chỉ có điều kiện '#define inline static' và xác định các hàm nội tuyến của bạn trong tiêu đề. –

+0

Tôi đoán điều này tránh được nhiều bản sao của cùng một hàm từ kết thúc trong nhị phân. Tôi chỉ nói rằng tôi đã thấy các tệp .inl được sử dụng theo cách này, không phải đó là kỹ thuật duy nhất (hoặc thậm chí tốt nhất). –

1

Tôi tin rằng đó chỉ là quy ước đặt tên cho tệp "tiêu đề" bao gồm mã nội tuyến. để tệp .h có thể chứa định nghĩa và tệp .inl chứa mã nội tuyến cần thiết cho mẫu.

tôi không belive có điều gì hơn để nó hơn một quy ước đặt tên để làm cho mục đích của tập tin rõ ràng

24

Vì không ai khác đã đề cập đến:

Việc sử dụng tệp .inl để lưu trữ các hàm nội tuyến có thể hữu ích để tăng tốc biên dịch.

Nếu bạn chỉ bao gồm khai báo (.h) nơi bạn cần khai báo và chỉ bao gồm triển khai nội tuyến (.inl) nơi bạn cần chúng (tức là chỉ trong tệp .cpp và các tệp .inl khác chứ không phải .h's), nó có thể có tác dụng có lợi trên các phụ thuộc tiêu đề của bạn.

Đây có thể là một chiến thắng đáng kể đối với các dự án lớn hơn với nhiều lớp tương tác.

+3

+1: thế giới chắc chắn là một nơi khác khi bạn đang quản lý hàng triệu dòng mã và hàng nghìn tệp. – gatorfax

+0

để bạn không bao giờ nên bao gồm .inl trong tệp tiêu đề? Tôi luôn có cảm giác rằng .inl nên được đặt ở dưới cùng của tệp tiêu đề vì các hàm nội tuyến yêu cầu khai báo và triển khai để có thể truy cập cùng một lúc. – Icebone1000

+1

Icebone1000 không phải tất cả các mô-đun bao gồm tiêu đề nhất thiết muốn sử dụng các hàm nội tuyến, do đó chúng không cần phải triển khai để đọc, chúng không bắt buộc phải có mặt nếu chúng không được sử dụng. –

66

Nick Meyer là đúng: Trình biên dịch không quan tâm đến phần mở rộng của tệp bạn đang đưa vào, vì vậy những thứ như ".h", ".hpp", ".hxx", ".hh", ". inl "," .inc ", vv là một quy ước đơn giản, để làm cho nó rõ ràng những gì các tập tin được cho là có chứa.

Ví dụ tốt nhất là các tệp tiêu đề STL không có phần mở rộng nào.

Thông thường, ".INL "file làm chứa inline mã (do đó" .inl "mở rộng).

Những file" .inl" file là một điều cần thiết khi bạn có một chu kỳ phụ thuộc giữa tiêu đề mã.

Đối Ví dụ:

// A.hpp 
struct A 
{ 
    void doSomethingElse() 
    { 
     // Etc. 
    } 

    void doSomething(B & b) 
    { 
     b.doSomethingElse() ; 
    } 
} ; 

Và:

// B.hpp 
struct B 
{ 
    void doSomethingElse() 
    { 
     // Etc. 
    } 

    void doSomething(A & a) 
    { 
     a.doSomethingElse() ; 
    } 
} ; 

không có cách nào bạn sẽ có nó biên dịch , bao gồm cả việc sử dụng tờ khai chuyển tiếp.

Giải pháp là sau đó để phá vỡ định nghĩa và thực hiện thành hai loại tập tin tiêu đề:

  • hpp khai báo tiêu đề/định nghĩa
  • inl để thực hiện tiêu đề

nào bị phá vỡ vào ví dụ sau:

// A.hpp 

struct B ; 

struct A 
{ 
    void doSomethingElse() ; 
    void doSomething(B & b) ; 
} ; 

Và:

// A.inl 
#include <A.hpp> 
#include <B.hpp> 

inline void A::doSomethingElse() 
{ 
    // Etc. 
} 

inline void A::doSomething(B & b) 
{ 
    b.doSomethingElse() ; 
} 

Và:

// B.hpp 

struct A ; 

struct B 
{ 
    void doSomethingElse() ; 
    void doSomething(A & a) ; 
} ; 

Và:

// B.INL 
#include <B.hpp> 
#include <A.hpp> 

inline void B::doSomethingElse() 
{ 
    // Etc. 
} 

inline void B::doSomething(A & a) 
{ 
    a.doSomethingElse() ; 
} 

Bằng cách này, bạn có thể bao gồm bất cứ điều gì ".inl" tập tin bạn cần trong nguồn của riêng bạn, và nó sẽ làm việc.

Một lần nữa, tên hậu tố của các tệp được bao gồm không thực sự quan trọng, chỉ sử dụng chúng.

+3

Điều này giải thích lợi ích thực sự (hoặc sự cần thiết) của sự tách biệt, và nên được chọn làm câu trả lời. – musiphil

+0

Nếu chức năng không phải là nội tuyến, bạn sẽ bạn tiêu chuẩn .cpp tập tin cho phần thực hiện? – Bublafus

+0

@ Bublafus: 'Nếu chức năng không phải là nội tuyến, bạn sẽ bạn chuẩn .cpp tập tin cho phần thực hiện?': Có thể. Các mẫu là các ví dụ về mã không thể thường được ẩn trong các tệp .CPP, do đó, trong trường hợp đó, tệp .INL sẽ là bắt buộc. – paercebal

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