Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Mendapat Ralat \'Multiple Definition\' dalam Fail Pengepala dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Saya Mendapat Ralat \'Multiple Definition\' dalam Fail Pengepala dan Bagaimana Saya Boleh Membetulkannya?

Patricia Arquette
Lepaskan: 2024-11-27 06:31:14
asal
162 orang telah melayarinya

Why Do I Get

Ralat Berbilang Definisi dalam Fail Pengepala: Mengapa dan Cara Menyelesaikannya

Penyusun menghadapi ralat "takrifan berbilang" apabila ia dibentangkan dengan berbilang definisi simbol dalam program yang sama. Ini boleh berlaku apabila berbilang fail sumber termasuk fail pengepala yang sama, setiap satunya mentakrifkan simbol yang sama.

Mari kita periksa sampel kod yang disediakan:

// 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&, const Complex&);
   float m_Real;
   float m_Imaginary;
};

std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
Salin selepas log masuk

Pengendali<< fungsi ditakrifkan dalam fail .h, menjadikannya calon untuk definisi berbilang kerana berbilang fail sumber akan memasukkannya.

// complex.cpp
#include "complex.h"
Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = 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

Apabila menyusun kod ini, pengkompil menghadapi ralat "takrifan berbilang" untuk pengendali<< fungsi.

Mengapa Tidak untuk real()?

Fungsi ahli real() diselaraskan secara tersirat, bermakna pengkompil menganggapnya seolah-olah ia diisytiharkan sebaris walaupun ia tidak dinyatakan secara eksplisit dalam .h fail.

Resolusi

Untuk menyelesaikan isu takrifan berbilang bagi pengendali<< fungsi, terdapat dua alternatif utama:

Sebaris Fungsi:
Tambah kata kunci sebaris pada definisi fungsi untuk mengarahkan pengkompil untuk menyelaraskannya:

inline std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
Salin selepas log masuk

Alihkan Definisi ke Fail .cpp:
Alih keluar definisi fungsi daripada fail .h dan letakkannya dalam fail .cpp yang sepadan:

// complex.cpp
std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
Salin selepas log masuk

Penyelesaian Lain

Penyelesaian tambahan termasuk:

  • Pragma sekali: Menggunakan arahan prapemproses dalam fail .h untuk menyekat berbilang kemasukan.
  • Sistem Modul: Menggunakan sistem modul (C 20 dan ke atas) untuk mengendalikan kebergantungan antara fail sumber.
  • Pengawal Pengepala: Memastikan bahawa fail .h mentakrifkan makro unik untuk mengelakkan kemasukan berbilang.

Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat \'Multiple Definition\' dalam Fail Pengepala dan Bagaimana Saya Boleh Membetulkannya?. 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