Bu tür kodlama standartlarının yerine "gerekir" den biridir. Bunun nedeni, hemen hemen bir C ++ ayrıştırıcısı uygulamak zorunda kalmanızdır.
Başlık dosyaları için çok yaygın bir kural, kendi başlarına durmaları gerektiğidir. Üstbilgi dosyası, söz konusu üstbilgiyi eklemeden önce başka bazı üstbilgi dosyalarının #include olmasını gerektirmemelidir. Bu test edilebilir bir gerekliliktir. Bazı rastgele üstbilgiler verildiğinde foo.hh, aşağıdakiler derlenmeli ve çalıştırılmalıdır:
#include "foo.hh"
int main () {
return 0;
}
Bu kuralın, bazı üstbilgilerde diğer sınıfların kullanımı ile ilgili sonuçları vardır. Bazen bu sonuçlardan, diğer sınıfların ileriye doğru bildirilmesiyle önlenebilir. Standart kütüphane sınıflarının çoğunda bu mümkün değildir. std::stringVeya gibi bir şablon örneğini iletmenin bir yolu yoktur std::vector<SomeType>. Sen zorunda #includetip tek kullanım bir işleve argüman olarak olsa bile başlığında bu STL başlıklarını.
Başka bir sorun, tesadüfen sürüklediğiniz şeylerle ilgilidir. Örnek: aşağıdakileri göz önünde bulundurun:
dosya foo.cc:
#include "foo.hh"
#include "bar.hh"
void Foo::Foo () : bar() { /* body elided */ }
void Foo::do_something (int item) {
...
bar.add_item (item);
...
}
İşte türünde barbir sınıf Fooveri üyesi Bar. Burada doğru olanı yaptınız ve sınıfı tanımlayan başlığa dahil edilmiş olsa bile #inc bar.hh eklediniz Foo. Ancak, Bar::Bar()ve tarafından kullanılan öğeleri eklemediniz Bar::add_item(int). Bu çağrıların ek harici referanslarla sonuçlanabileceği birçok durum vardır.
foo.oGibi bir araçla analiz ederseniz nm, içindeki fonksiyonlar foo.ccuygun olmayan her türlü şeyi çağırıyor gibi görünecektir #include. Peki, #includebu arızi harici referanslar için direktifler eklemeniz gerekir mi foo.cc? Cevap kesinlikle değil. Sorun, tesadüfen çağrılan işlevleri doğrudan çağrılan işlevlerden ayırmanın çok zor olmasıdır.