Bir .inl dosyasında bildirimlere sahip olmanın avantajları nelerdir? Aynısını ne zaman kullanmam gerekir?
Bir .inl dosyasında bildirimlere sahip olmanın avantajları nelerdir? Aynısını ne zaman kullanmam gerekir?
Yanıtlar:
.inldosyalar asla zorunlu değildir ve derleyici için özel bir önemi yoktur. Bu, kodu okuyabilecek insanlara bir ipucu sağlayan kodunuzu yapılandırmanın bir yolu.
Kullandığım .inliki durumda dosyaları:
Her iki durumda da, ben, diğer dosyaları tarafından eklenen üstbilgi dosyasında sonra fonksiyonların beyanlarını koymak başlık dosyasına altındaki dosyayı.#include.inl
Arayüzü uygulamadan ayırdığı ve başlık dosyasının okunmasını biraz daha kolaylaştırdığı için beğendim. Uygulama detaylarını önemsiyorsanız, .inldosyayı açıp okuyabilirsiniz. Eğer yapmazsan, zorunda değilsin.
.tccşablon uygulama dosyaları için kullanır .
glm, .hpp ve .inl'yi tam olarak yukarıda bahsettiğiniz şekilde kullanır. Bilmekte
Nick Meyer haklı: Derleyici, dahil ettiğiniz dosyanın uzantısını önemsemiyor, bu nedenle ".h", ".hpp", ".hxx", ".hh", ".inl" gibi şeyler, ".inc" vb. dosyaların ne içermesi gerektiğini açıklığa kavuşturmak için basit bir kuraldır.
En iyi örnek, uzantısı olmayan STL başlık dosyalarıdır.
Genellikle, ".inl" dosyaları satır içi kod içerir (dolayısıyla ".inl" uzantısı).
Bu dosyalar ".inl" dosyaları, başlık kodu arasında bir bağımlılık döngüsüne sahip olduğunuzda bir gerekliliktir .
Örneğin:
// A.hpp
struct A
{
void doSomethingElse()
{
// Etc.
}
void doSomething(B & b)
{
b.doSomethingElse() ;
}
} ;
Ve:
// B.hpp
struct B
{
void doSomethingElse()
{
// Etc.
}
void doSomething(A & a)
{
a.doSomethingElse() ;
}
} ;
İleriye dönük bildirimi kullanmak dahil, derlemenizin hiçbir yolu yoktur.
Çözüm daha sonra tanımı ve uygulamayı iki tür başlık dosyasına bölmektir:
hpp başlık bildirimi / tanımı içininl başlık uygulaması içinBu, aşağıdaki örneğe ayrılıyor:
// A.hpp
struct B ;
struct A
{
void doSomethingElse() ;
void doSomething(B & b) ;
} ;
Ve:
// A.inl
#include <A.hpp>
#include <B.hpp>
inline void A::doSomethingElse()
{
// Etc.
}
inline void A::doSomething(B & b)
{
b.doSomethingElse() ;
}
Ve:
// B.hpp
struct A ;
struct B
{
void doSomethingElse() ;
void doSomething(A & a) ;
} ;
Ve:
// B.INL
#include <B.hpp>
#include <A.hpp>
inline void B::doSomethingElse()
{
// Etc.
}
inline void B::doSomething(A & a)
{
a.doSomethingElse() ;
}
Bu şekilde, ihtiyacınız olan ".inl" dosyasını kendi kaynağınıza dahil edebilirsiniz ve çalışacaktır.
Yine, dahil edilen dosyaların sonek isimleri gerçekten önemli değildir, sadece kullanımlarıdır.
If the function were not inline, you would you standard .cpp file for the implementation part?Muhtemelen. Şablonlar, genellikle .CPP dosyalarında gizlenemeyen kod örnekleridir, bu nedenle bu durumda .INL dosyası zorunlu olacaktır.
Bundan başka kimse bahsetmediğinden:
Satır içi işlevlerinizi saklamak için .inl dosyalarının kullanılması, derlemeleri hızlandırmak için yararlı olabilir.
Yalnızca bildirimlere ihtiyaç duyduğunuz bildirimleri (.h) eklerseniz ve yalnızca ihtiyaç duyduğunuz yerde satır içi uygulamaları (.inl) dahil ederseniz (yani muhtemelen yalnızca .cpp ve diğer .inl dosyalarında, .h'lerde değil), bir başlık bağımlılıklarınız üzerinde faydalı etki.
Bu, birçok etkileşimli sınıfın bulunduğu daha büyük projelerde önemli bir kazanç olabilir.
Tecrübelerime göre, .inl dosyaları satır içi işlevleri tanımlamak için kullanılır. Bir .inl dosyasındayken, dosya, satır içi işlevleri almak için bir başlığa ve düzenli işlev tanımlarını almak için bir .c dosyasına dahil edilebilir.
Bu şekilde, aynı kaynak, satır içi işlev desteğine sahip olmayan derleyiciler ve sahip olan derleyicilerle daha kolay çalışabilir.
Tüm C ++ derleyicileri satır içi işlevleri desteklediğinden, genellikle C ++ koduyla değil, genellikle düz C koduyla kullanılırlar.
#define inline staticolarak ve başlıkta satır içi işlevlerinizi tanımlarsınız.
Bunun yalnızca satır içi kodu içeren bir "başlık" dosyası için bir adlandırma kuralı olduğuna inanıyorum. Bu, .h dosyalarının tanımları ve .inl dosyalarının şablonlar için gerekli olan satır içi kodu içermesi içindir.
Dosyanın amacını açıklığa kavuşturmak için bir adlandırma kuralından daha fazlası olduğuna inanmıyorum