Apa keuntungan memiliki deklarasi dalam file .inl? Kapan saya perlu menggunakan yang sama?
Apa keuntungan memiliki deklarasi dalam file .inl? Kapan saya perlu menggunakan yang sama?
Jawaban:
.inlfile tidak pernah wajib dan tidak memiliki arti khusus bagi kompiler. Itu hanya cara menyusun kode Anda yang memberikan petunjuk kepada manusia yang mungkin membacanya.
Saya menggunakan .inlfile dalam dua kasus:
Dalam kedua kasus, saya menempatkan deklarasi fungsi dalam file header, yang termasuk oleh file lain, maka saya #includeyang .inlfile pada bagian bawah file header.
Saya suka karena ini memisahkan antarmuka dari implementasi dan membuat file header sedikit lebih mudah dibaca. Jika Anda peduli dengan detail implementasi, Anda dapat membuka .inlfile dan membacanya. Jika tidak, Anda tidak perlu melakukannya.
.tccuntuk file implementasi template.
glmmenggunakan .hpp dan .inl dengan cara yang persis sama seperti yang Anda sebutkan di atas. Senang mengetahui, terima kasih atas jawaban yang bagus :)
Nick Meyer benar: Kompilator tidak peduli dengan ekstensi file yang Anda masukkan, jadi hal-hal seperti ".h", ".hpp", ".hxx", ".hh", ".inl", ".inc", dll. adalah konvensi sederhana, untuk memperjelas isi file apa saja.
Contoh terbaik adalah file header STL yang tidak memiliki ekstensi apa pun.
Biasanya, file ".inl" memang berisi kode inline (karenanya ekstensi ".inl").
File-file ".inl" tersebut diperlukan ketika Anda memiliki siklus ketergantungan antara kode header .
Sebagai contoh:
// A.hpp
struct A
{
void doSomethingElse()
{
// Etc.
}
void doSomething(B & b)
{
b.doSomethingElse() ;
}
} ;
Dan:
// B.hpp
struct B
{
void doSomethingElse()
{
// Etc.
}
void doSomething(A & a)
{
a.doSomethingElse() ;
}
} ;
Tidak mungkin Anda membuatnya dikompilasi, termasuk menggunakan deklarasi maju.
Solusinya kemudian memecah definisi dan implementasi menjadi dua jenis file header:
hpp untuk deklarasi / definisi headerinl untuk implementasi headerYang terurai menjadi contoh berikut:
// A.hpp
struct B ;
struct A
{
void doSomethingElse() ;
void doSomething(B & b) ;
} ;
Dan:
// A.inl
#include <A.hpp>
#include <B.hpp>
inline void A::doSomethingElse()
{
// Etc.
}
inline void A::doSomething(B & b)
{
b.doSomethingElse() ;
}
Dan:
// B.hpp
struct A ;
struct B
{
void doSomethingElse() ;
void doSomething(A & a) ;
} ;
Dan:
// B.INL
#include <B.hpp>
#include <A.hpp>
inline void B::doSomethingElse()
{
// Etc.
}
inline void B::doSomething(A & a)
{
a.doSomethingElse() ;
}
Dengan cara ini, Anda dapat menyertakan file ".inl" apa pun yang Anda perlukan di sumber Anda sendiri, dan ini akan berhasil.
Sekali lagi, nama sufiks dari file yang disertakan tidak terlalu penting, hanya kegunaannya.
If the function were not inline, you would you standard .cpp file for the implementation part?:: Mungkin. Template adalah contoh kode yang biasanya tidak dapat disembunyikan dalam file .CPP, jadi dalam hal ini, file .INL akan menjadi wajib.
Karena tidak ada orang lain yang menyebutkannya:
Penggunaan file .inl untuk menyimpan fungsi inline Anda dapat berguna untuk mempercepat kompilasi.
Jika Anda hanya menyertakan deklarasi (.h) di mana Anda memerlukan deklarasi, dan hanya menyertakan implementasi inline (.inl) di mana Anda membutuhkannya (misalnya, mungkin hanya dalam .cpp dan file .inl lainnya, bukan .h), ia dapat memiliki a efek menguntungkan pada dependensi header Anda.
Ini bisa menjadi kemenangan signifikan pada proyek yang lebih besar dengan banyak kelas yang berinteraksi.
Dalam pengalaman saya, file .inl digunakan untuk mendefinisikan fungsi inline. Saat mereka berada dalam file .inl, file tersebut dapat dimasukkan dalam header untuk mendapatkan fungsi inline dan dalam file .c untuk mendapatkan definisi fungsi biasa.
Dengan cara ini, sumber yang sama bisa lebih mudah bekerja dengan kompiler yang tidak memiliki dukungan fungsi sebaris seperti halnya kompiler yang memilikinya.
Mereka biasanya digunakan dengan kode C langsung, tidak sering dengan kode C ++ karena semua kompiler C ++ mendukung fungsi inline.
#define inline static, dan menentukan fungsi inline Anda di header.
Saya percaya itu hanya konvensi penamaan untuk file "header" yang menyertakan kode inline. itu agar file .h dapat berisi definisi dan file .inl berisi kode inline yang diperlukan untuk template.
Saya tidak percaya ada yang lebih dari itu selain konvensi penamaan untuk membuat tujuan file menjadi jelas