Hal-hal apa yang benar-benar tidak boleh dimasukkan dalam file header?
Jika misalnya saya bekerja dengan format standar industri terdokumentasi yang memiliki banyak konstanta, apakah itu praktik yang baik untuk mendefinisikannya dalam file header (jika saya menulis parser untuk format itu)?
Fungsi apa yang harus masuk ke file header?
Fungsi apa yang seharusnya tidak?
Jawaban:
Apa yang dimasukkan ke dalam tajuk:
#include
arahan minimal yang diperlukan untuk membuat header dapat dikompilasi ketika header dimasukkan dalam beberapa file sumber.Apa yang tidak termasuk dalam tajuk:
#include
Arahan serampangan . Mereka serampangan termasuk menyebabkan kompilasi ulang hal-hal yang tidak perlu dikompilasi ulang, dan kadang-kadang bisa membuatnya sehingga sistem tidak dapat dikompilasi. Jangan#include
file dalam header jika header itu sendiri tidak memerlukan file header lainnya.#include
, yang dapat berubah, atau yang terlalu besar. Fungsi-fungsi sebaris harus memiliki sedikit jika ada kipas keluar, dan jika mereka memiliki kipas keluar, itu harus dilokalisasi ke hal-hal yang didefinisikan dalam header.Apa yang merupakan set minimal
#include
pernyataan?Ini ternyata menjadi pertanyaan tidak trivial. Definisi TL; DR: File header harus menyertakan file header yang secara langsung mendefinisikan masing-masing jenis yang digunakan secara langsung atau yang secara langsung mendeklarasikan setiap fungsi yang digunakan dalam file header yang dimaksud, tetapi tidak boleh menyertakan hal lain. Pointer atau tipe referensi C ++ tidak memenuhi syarat sebagai penggunaan langsung; referensi ke depan lebih disukai.
Ada tempat untuk
#include
arahan gratis , dan ini dalam tes otomatis. Untuk setiap file header dalam paket perangkat lunak, saya secara otomatis menghasilkan dan kemudian mengkompilasi yang berikut:Kompilasi harus bersih (mis. Bebas dari segala peringatan atau kesalahan). Peringatan atau kesalahan mengenai tipe tidak lengkap atau tipe tidak dikenal berarti bahwa file header yang diuji memiliki beberapa
#include
arahan yang hilang dan / atau hilang deklarasi maju. Catatan baik: Hanya karena tes lulus tidak berarti bahwa set#include
arahan cukup, apalagi minimal.sumber
Selain apa yang sudah dikatakan.
File H harus selalu mengandung:
File H tidak boleh mengandung:
static
.(Saya juga akan mengatakan bahwa tidak pernah ada alasan untuk menggunakan variabel global / eksternal non-konstan, di mana saja, tapi itu diskusi untuk pos lain.)
sumber
Saya mungkin tidak akan mengatakan tidak pernah, tetapi pernyataan yang menghasilkan data dan kode seperti diuraikan seharusnya tidak dalam file .h.
Makro, fungsi inline, dan templat mungkin terlihat seperti data atau kode, tetapi makro tidak menghasilkan kode saat diuraikan, tetapi saat digunakan. Barang-barang ini sering perlu digunakan di lebih dari satu .c atau .cpp, sehingga barang-barang tersebut termasuk dalam .h.
Dalam pandangan saya, file header harus memiliki antarmuka praktis minimum untuk .c atau .cpp yang sesuai. Antarmuka dapat mencakup # definisi, kelas, typedef, definisi struktur, prototipe fungsi, dan definisi eksternal yang kurang disukai, untuk variabel global. Namun, jika deklarasi hanya digunakan dalam satu file sumber, itu mungkin harus dikecualikan dari .h dan terkandung dalam file sumber sebagai gantinya.
Beberapa mungkin tidak setuju, tetapi kriteria pribadi saya untuk file .h adalah bahwa mereka # mencantumkan semua file .h lain yang mereka butuhkan untuk dapat dikompilasi. Dalam beberapa kasus, ini bisa menjadi banyak file, jadi kami memiliki beberapa metode yang efektif untuk mengurangi dependensi eksternal seperti meneruskan deklarasi ke kelas yang memungkinkan kami menggunakan pointer ke objek kelas tanpa menyertakan apa yang bisa menjadi pohon besar file include.
sumber
File header harus memiliki organisasi berikut:
File header tidak boleh berisi definisi objek, hanya ketik definisi dan deklarasi objek.
sumber
Pernyataan yang menghasilkan data dan kode saat diuraikan, tidak boleh dalam
.h
file. Sejauh menyangkut sudut pandang saya, file header seharusnya hanya memiliki antarmuka praktis minimum untuk yang sesuai.c
atau.cpp
.sumber