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::string
Veya gibi bir şablon örneğini iletmenin bir yolu yoktur std::vector<SomeType>
. Sen zorunda #include
tip 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 bar
bir sınıf Foo
veri ü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.o
Gibi bir araçla analiz ederseniz nm
, içindeki fonksiyonlar foo.cc
uygun olmayan her türlü şeyi çağırıyor gibi görünecektir #include
. Peki, #include
bu 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.