Mengapa Kod C Saya Membuang Ralat 'Berbilang Definisi'?

Linda Hamilton
Lepaskan: 2024-11-20 04:32:02
asal
437 orang telah melayarinya

Why Does My C   Code Throw a “Multiple Definition” Error?

Ralat Takrif Berbilang: Penyelesaian kepada Takrifan Bercanggah

Dalam C , apabila mentakrifkan fungsi atau kelas dalam pengepala dan melaksanakannya dalam fail sumber, pembangun mungkin menghadapi ralat "takrif berbilang." Ralat ini timbul apabila berbilang unit terjemahan (fail sumber) mengandungi takrifan untuk pengecam yang sama.

Punca Takrifan Berbilang

Ralat "takrifan berbilang" berlaku apabila fail pengepala yang mengandungi takrifan disertakan dalam berbilang unit terjemahan. Ini boleh berlaku apabila:

  • Fail pengepala disertakan dalam kedua-dua fail sumber dan fail pengepala yang sepadan.
  • Takrifan disediakan dalam fail pengepala dan bukannya pengisytiharan.

Memahami Ralat

Pertimbangkan contoh kod yang disediakan:

// complex.h
class Complex
{
public:
   friend std::ostream& operator<<(std::ostream&, const Complex&);
};

// complex.cpp
std::ostream& operator<<(std::ostream&, const Complex&);
Salin selepas log masuk

Dalam contoh ini, takrifan operator << ; berada dalam complex.h dan bukannya complex.cpp. Ini boleh membawa kepada ralat takrifan berbilang kerana kedua-dua main.cpp dan complex.cpp akan cuba mentakrifkan << pengendali untuk kelas Kompleks.

Penyelesaian kepada Berbilang Definisi

Penyelesaian untuk ralat definisi berbilang ialah:

  • Gunakan Kata Kunci "sebaris": Dengan mengisytiharkan fungsi sebagai sebaris, anda membenarkan berbilang unit terjemahan untuk memberikan definisi tanpa menyebabkan konflik. Walau bagaimanapun, fungsi sebaris mempunyai beberapa had, seperti kesan prestasi pada fungsi besar.
  • Alihkan Definisi ke Fail Sumber: Daripada mentakrifkan operator << dalam fail pengepala, alihkannya ke fail sumber yang sepadan (complex.cpp). Ini memastikan definisi hanya wujud dalam satu unit terjemahan.

Menggunakan kata kunci sebaris atau mengalihkan definisi ke fail sumber ialah penyelesaian pilihan untuk mengelakkan ralat definisi berganda.

Perbezaan dalam Mengendalikan real() dan <<

Dalam sampel kod, fungsi real() diisytiharkan dalam complex.h, tetapi tidak ditakrifkan. Inilah sebabnya mengapa pengkompil tidak melaporkan ralat definisi berganda untuknya. Fungsi ahli yang diisytiharkan dalam pengisytiharan kelas adalah sebaris secara tersirat, bermakna takrifan mereka dimasukkan ke dalam semua unit terjemahan yang termasuk pengepala. Ini tidak berlaku untuk pengendali << fungsi, yang ditakrifkan dalam kompleks.h.

Atas ialah kandungan terperinci Mengapa Kod C Saya Membuang Ralat 'Berbilang Definisi'?. 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