複数のヘッダー ファイルを使用して C プログラムをコンパイルしようとすると、「[シンボルの複数の定義」というエラーが発生する可能性があります。 ]。」このエラーは、コード内で同じシンボル (関数や変数など) が複数回定義されている場合に発生します。
次の例を考えてみましょう:
// 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& operator<<(std::ostream& o, const Complex& 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& operator<<(std::ostream& o, const Complex& 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; }
このコードをコンパイルすると、前述のエラーが発生します。この問題は演算子<<の定義から発生します。関数はoperator.cppにあります。ヘッダー ファイルには関数の宣言が含まれていますが、operator.cpp 内の定義はインライン展開されません。その結果、コンパイラは関数の 2 つの別々の定義を生成し、多重定義エラーが発生します。
暗黙的にインライン展開される real() のようなパブリック メンバー関数とは異なり、operator
このエラーを解決するには、次のいずれかを実行できます。
// complex.h ... inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; } ...
// complex.cpp ... std::ostream& operator<<(std::ostream& o, const Complex& Cplx) { return o << Cplx.m_Real << " i" << Cplx.m_Imaginary; } ...
関数をインライン化するか、その定義を実装ファイルに配置することにより、複数定義エラーを回避でき、プログラムが正常にコンパイルされるようになります。
以上がC でヘッダー ファイルで関数を定義すると「複数定義」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。