Rumah >pembangunan bahagian belakang >C++ >Mengapa Mentakrifkan Fungsi dalam Fail Pengepala Menyebabkan Ralat \'Definisi Berbilang\' dalam C ?

Mengapa Mentakrifkan Fungsi dalam Fail Pengepala Menyebabkan Ralat \'Definisi Berbilang\' dalam C ?

Linda Hamilton
Linda Hamiltonasal
2024-11-19 07:00:031001semak imbas

Why Does Defining a Function in a Header File Cause a

Mengapa Takrifan Berbilang Simbol dalam Pengepala?

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&amp; operator<<(std::ostream&amp; o, const Complex&amp; 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&amp; operator<<(std::ostream&amp; o, const Complex&amp; 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:

  • Sebaris operator<< definisi fungsi dalam fail pengepala:
// complex.h
...
inline std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
  • Alihkan operator<< takrifan kepada fail pelaksanaan:
// complex.cpp
...
std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn