여러 헤더 파일이 포함된 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의 정의는 인라인되지 않습니다. 결과적으로 컴파일러는 함수에 대해 두 개의 별도 정의를 생성하여 다중 정의 오류를 발생시킵니다.
암시적으로 인라인되는 real()과 같은 공개 멤버 함수와 달리, 연산자<< 여러 정의를 허용하려면 명시적으로 인라인으로 표시해야 합니다.
이 오류를 해결하려면 다음 중 하나를 수행하세요.
// 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!