Apabila cuba menyusun atur cara C dengan berbilang fail pengepala, ada kemungkinan ralat "takrif berbilang [simbol ]." Ralat ini berlaku apabila simbol yang sama (seperti fungsi atau pembolehubah) ditakrifkan lebih daripada sekali dalam kod.
Pertimbangkan contoh berikut:
// complex.h #ifndef COMPLEX_H #define COMPLEX_H #include <iostream> class Complex { public: Complex(float Real, float Imaginary); float real() const { return m_Real; }; private: friend std::ostream& operator<<(std::ostream& o, const Complex& Cplx); float m_Real; float m_Imaginary; }; #endif // COMPLEX_H // complex.cpp #include "complex.h" Complex::Complex(float Real, float Imaginary) { m_Real = Real; m_Imaginary = Imaginary; }
// operator.cpp #include "complex.h" std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; }
// main.cpp #include "complex.h" #include <iostream> int main() { Complex Foo(3.4, 4.5); std::cout << Foo << "\n"; return 0; }
Menyusun kod ini akan mengakibatkan ralat yang disebutkan di atas. Isu timbul daripada takrifan operator<< fungsi dalam operator.cpp. Walaupun fail pengepala termasuk pengisytiharan fungsi, definisi dalam operator.cpp tidak sebaris. Akibatnya, pengkompil menjana dua takrifan fungsi yang berasingan, menyebabkan ralat takrifan berbilang.
Tidak seperti fungsi ahli awam seperti real(), yang secara tersirat sebaris, fungsi bukan ahli seperti operator<< perlu ditanda secara eksplisit sebagai sebaris untuk membolehkan definisi berbilang.
Untuk menyelesaikan ralat ini, seseorang boleh sama ada:
// complex.h ... inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; } ...
// complex.cpp ... std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; } ...
Dengan menyelaraskan fungsi atau meletakkan takrifannya dalam fail pelaksanaan, ralat takrifan berbilang boleh dielakkan, memastikan atur cara menyusun dengan jayanya.
Atas ialah kandungan terperinci Mengapa Mentakrifkan Fungsi dalam Fail Pengepala Menyebabkan Ralat \'Definisi Berbilang\' dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!