Termasuk Fail .cpp: Adakah Ia Memperkenalkan Pendua?
Dalam konteks pengaturcaraan, fail pengepala (.h) dan fail sumber (. cpp) memainkan peranan penting. Fail pengepala mengandungi pengisytiharan fungsi dan kelas, membolehkan modul lain berinteraksi dengannya. Walaupun pada umumnya disyorkan untuk memasukkan fail pengepala, persoalan timbul: Bolehkah anda memasukkan fail sumber (.cpp) secara langsung?
Jawapannya ialah "tidak". Termasuk fail .cpp boleh membawa kepada ralat definisi berbilang. Untuk memahami sebabnya, mari kita periksa kod berikut:
// main.cpp #include <iostream> #include "foop.h" int main() { int x = 42; std::cout << x << std::endl; std::cout << foo(x) << std::endl; return 0; }
// foop.h #ifndef FOOP_H #define FOOP_H int foo(int a); #endif
// foop.cpp int foo(int a) { return ++a; }
Dengan fail pengepala disertakan, kod tersebut menyusun dan berjalan tanpa masalah. Walau bagaimanapun, katakan kita tersilap memasukkan fail sumber (.cpp) dan bukannya fail pengepala:
// main.cpp #include <iostream> #include "foop.cpp" int main() { int x = 42; std::cout << x << std::endl; std::cout << foo(x) << std::endl; return 0; }
Dalam senario ini, pengkompil membuat ralat:
multiple definition of foo(int) first defined here
Apa yang menyebabkan kesilapan ini? Apabila prapemproses memasukkan fail sumber (.cpp), ia menyalin keseluruhan kandungan fail tersebut ke dalam fail semasa. Jadi, pada asasnya, kod berikut akan dihasilkan:
// main.cpp #include <iostream> int foo(int a) { return ++a; } int main() { int x = 42; std::cout << x << std::endl; std::cout << foo(x) << std::endl; return 0; }
Seperti yang anda lihat, fungsi foo() kini ditakrifkan dua kali dalam fail yang sama, yang membawa kepada ralat definisi berganda. Untuk mengelakkan isu ini, adalah penting untuk memasukkan fail pengepala (.h) dan bukannya fail sumber (.cpp). Fail pengepala mengisytiharkan fungsi dan kelas tanpa pelaksanaannya, menghalang pertindihan dan memastikan bahawa hanya satu definisi bagi setiap fungsi wujud dalam keseluruhan program.
Atas ialah kandungan terperinci Mengapa Anda Perlu Mengelak Memasukkan Fail .cpp Daripada Fail .h?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!