首頁 > 後端開發 > C++ > 為什麼頭檔中出現「多重定義」錯誤,如何修復它們?

為什麼頭檔中出現「多重定義」錯誤,如何修復它們?

Patricia Arquette
發布: 2024-11-27 06:31:14
原創
170 人瀏覽過

Why Do I Get

頭檔中的多個定義錯誤:為什麼以及如何解決它們

編譯器在出現多個定義時會遇到“多個定義」錯誤同一程式中符號的定義。當多個來源文件包含相同的頭文件,並且每個頭文件定義相同的符號時,就會發生這種情況。

讓我們檢查一下提供的程式碼範例:

// 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;
}
登入後複製

運算子

// complex.cpp
#include "complex.h"
Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = Imaginary;
}
登入後複製
// main.cpp
#include "complex.h"
#include <iostream>
int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
登入後複製

編譯此程式碼時,編譯器遇到「多重定義」錯誤對於操作員

為什麼不使用 real()?

real() 成員函數是隱式內聯的,這意味著編譯器將其視為內聯函數,即使它被宣告為內聯函數.h中沒有明確指定

解決方案

解決運算符的多重定義問題

內嵌函數:
將inline關鍵字加入函數定義中以指示編譯器內聯它:

inline std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
登入後複製

將定義移至.cpp 檔案:
刪除函數定義從.h 檔案中將其放入相應的.cpp文件中:

// complex.cpp
std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
登入後複製

其他解決方案

其他解決方案包括:

  • Pragma Once:在.h 檔案中使用預處理器指令來抑制多個包含。
  • 模組系統: 使用模組系統(C 20 以上)處理原始檔案之間的依賴關係。
  • 標頭防護:確保 .h 檔案定義唯一的巨集以防止多次包含。

以上是為什麼頭檔中出現「多重定義」錯誤,如何修復它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板