Reduce the number of #include files in header files. It will reduce build times. Instead, put include files in source code files and use forward declarations in header files.
Saya membaca ini di sini. http://www.yolinux.com/TUTORIALS/LinuxTutorialC++CodingStyle.html .
Jadi dikatakan jika kelas (kelas A) dalam file header tidak perlu menggunakan definisi sebenarnya dari beberapa kelas (kelas B). Pada saat itu kita dapat menggunakan deklarasi maju alih-alih termasuk file header (kelas B) tertentu.
Pertanyaan: Jika kelas (kelas A) di header jika tidak menggunakan definisi aktual dari kelas tertentu (kelas B), lalu bagaimana deklarasi maju membantu mengurangi waktu kompilasi?
sumber
vehicle.h
,bus.h
,toybus.h
.vehicle.h
termasuk olehbus.h
danbus.h
termasuk olehtoybus.h
. jadi jika saya melakukan beberapa perubahanbus.h
. apakah kompiler terbuka dan mem-parsingvehicle.h
lagi? apakah itu mengkompilasinya lagi?#pragma once
atau#ifndef __VEHICLE_H_
mengetik deklarasi dalam file header untuk mencegah file seperti itu dimasukkan beberapa kali (atau digunakan beberapa kali setidaknya dalam kasus ifndef).karena itu A.hpp tidak perlu # mencantumkan B.hpp
jadi A.hpp menjadi
jadi ketika A.hpp dimasukkan maka B.hpp tidak disertakan secara implisit dan semua file yang hanya bergantung pada A.hpp tidak perlu dikompilasi ulang setiap kali perubahan b.hpp
sumber
Ingat, C / C ++ preprocessor adalah langkah pemrosesan terpisah, murni tekstual. The
#include
tarikan direktif dalam isi header disertakan dan compiler harus mengurai itu. Selain itu, kompilasi masing-masing.cpp
benar-benar terpisah, sehingga fakta bahwa kompiler hanya diuraikanB.h
ketika mengkompilasiB.cpp
tidak membantunya ketika dibutuhkan lagi ketika mengkompilasiA.cpp
. Dan lagi saat kompilasiC.cpp
. DanD.cpp
. Dan seterusnya. Dan masing-masing file tersebut harus dikompilasi ulang jika ada file yang termasuk di dalamnya telah berubah.Jadi katakanlah kelas
A
menggunakan kelasB
dan kelasC
danD
menggunakan kelasA
, tetapi tidak perlu memanipulasiB
. Jika kelasA
dapat dideklarasikan hanya dengan deklarasi majuB
, daripadaB.h
dikompilasi dua kali: ketika mengkompilasiB.cpp
danA.cpp
(karenaB
masih diperlukan di dalamA
metode).Tapi ketika
A.h
meliputiB.h
, dikompilasi empat kali-saat kompilasiB.cpp
,A.cpp
,C.cpp
danD.cpp
sebagai kemudian dua sekarang secara tidak langsung termasukB.h
juga.Juga ketika tajuk dimasukkan lebih dari sekali, preprocessor masih harus membacanya setiap kali. Ini akan melewati pemrosesan kontennya karena
#ifdef
pelindung, tetapi masih membacanya dan perlu mencari ujung penjaga, yang berarti harus menguraikan semua arahan preprosesor di dalam.(Seperti yang disebutkan dalam jawaban lain, header yang dikompilasi berusaha untuk mengatasi hal ini, tetapi mereka adalah kaleng cacing mereka sendiri; pada dasarnya Anda dapat menggunakannya secara wajar untuk header sistem dan hanya jika Anda tidak menggunakan terlalu banyak dari mereka, tetapi tidak untuk header di proyek Anda)
sumber
Deklarasi penerusan jauh lebih cepat untuk diuraikan daripada seluruh file tajuk yang dengan sendirinya mungkin menyertakan lebih banyak file tajuk.
Juga, jika Anda mengubah sesuatu di file header untuk kelas B, segala sesuatu termasuk header itu harus dikompilasi ulang. Dengan deklarasi maju, itu mungkin hanya file sumber tempat implementasi A berada. Tetapi jika header A benar-benar termasuk header B, semuanya termasuk
a.hpp
akan dikompilasi ulang juga, bahkan jika itu tidak menggunakan apa pun dari B.sumber