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
Lepaskan: 2024-11-19 07:00:03
asal
995 orang telah melayarinya

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;
}
Salin selepas log masuk
// 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;
}
Salin selepas log masuk
// main.cpp
#include "complex.h"
#include <iostream>

int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
Salin selepas log masuk

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;
}
...
Salin selepas log masuk
  • 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;
}
...
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan