Ini adalah salah satu dari jenis standar pengkodean "harus" daripada "harus". Alasannya adalah Anda harus menulis parser C ++ untuk menjalankannya.
Aturan yang sangat umum untuk file header adalah mereka harus berdiri sendiri. File tajuk tidak boleh mengharuskan beberapa file tajuk lainnya disertakan # sebelum memasukkan tajuk yang dimaksud. Ini adalah persyaratan yang dapat diuji. Diberikan beberapa tajuk acak foo.hh
, yang berikut ini harus dikompilasi dan dijalankan:
#include "foo.hh"
int main () {
return 0;
}
Aturan ini memiliki konsekuensi berkaitan dengan penggunaan kelas lain di beberapa header. Terkadang konsekuensi tersebut dapat dihindari dengan meneruskan mendeklarasikan kelas-kelas lainnya. Ini tidak mungkin dengan banyak kelas perpustakaan standar. Tidak ada cara untuk meneruskan mendeklarasikan contoh template seperti std::string
atau std::vector<SomeType>
. Anda harus memiliki #include
tajuk STL di tajuk meskipun hanya menggunakan jenis ini sebagai argumen untuk fungsi.
Masalah lain adalah dengan hal-hal yang secara tidak sengaja Anda seret. Contoh: pertimbangkan yang berikut:
file foo.cc:
#include "foo.hh"
#include "bar.hh"
void Foo::Foo () : bar() { /* body elided */ }
void Foo::do_something (int item) {
...
bar.add_item (item);
...
}
Berikut bar
adalah Foo
data anggota kelas yang bertipe Bar
. Anda telah melakukan hal yang benar di sini dan telah memasukkan # bar.hh meskipun itu harus dimasukkan dalam header yang mendefinisikan kelas Foo
. Namun, Anda belum memasukkan barang yang digunakan oleh Bar::Bar()
dan Bar::add_item(int)
. Ada banyak kasus di mana panggilan ini dapat menghasilkan referensi eksternal tambahan.
Jika Anda menganalisis foo.o
dengan alat seperti nm
itu, akan tampak bahwa fungsi di foo.cc
memanggil semua jenis hal yang belum Anda lakukan sesuai #include
. Jadi, haruskah Anda menambahkan #include
arahan untuk referensi eksternal insidentil itu foo.cc
? Jawabannya sama sekali tidak. Masalahnya adalah sangat sulit untuk membedakan fungsi-fungsi yang dipanggil secara kebetulan dari yang dipanggil secara langsung.