>  기사  >  백엔드 개발  >  여러 소스 파일에 함수 정의가 포함된 헤더 파일을 포함하면 \"다중 정의\" 오류가 발생하는 이유는 무엇입니까?

여러 소스 파일에 함수 정의가 포함된 헤더 파일을 포함하면 \"다중 정의\" 오류가 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-16 02:07:03476검색

Why does including a header file with a function definition in multiple source files lead to a

헤더 파일의 다중 정의 오류

문제 정의

다음 코드 샘플을 고려하세요.

// 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;
};

std::ostream& operator<<(std::ostream& 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;
}

이 코드를 컴파일할 때 코드를 실행하면 컴파일러에서 오류를 보고합니다.

multiple definition of operator<<(std::ostream&, Complex const&)

오류 분석

이 오류가 발생하는 이유는 연산자<< complex.h의 함수는 선언이 아니라 실제 정의입니다. 이는 complex.cpp와 main.cpp 모두 헤더 파일을 포함할 때 컴파일러가 함수를 두 번 정의하려고 시도한다는 것을 의미합니다. 이로 인해 다중 정의 오류가 발생합니다.

컴파일러는 공개 멤버 함수 real()이 암시적으로 인라인되기 때문에 이에 대해 불평하지 않습니다. 이는 컴파일러가 이를 사용하는 모든 번역 단위에서 real()에 대한 코드를 생성한다는 것을 의미합니다.

해결책

이 문제에 대한 두 가지 주요 해결 방법이 있습니다.

  1. 메이크 연산자<< 인라인 함수:

    연산자를 표시하여<< 인라인 기능이므로 여러 번역 단위로 정의할 수 있습니다.

    inline std::ostream& operator<<(std::ostream& o, const Complex& Cplx) {
       return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
    }
  2. 이동 연산자<< complex.cpp에 대한 정의:

    또는 연산자<< complex.cpp 소스 파일의 함수를 사용하여 한 번만 정의되도록 합니다.

추가 솔루션

inline 키워드를 사용하거나 정의를 소스로 이동하는 것 외에 파일에는 또 다른 가능한 해결책이 있습니다:

  1. 헤더 가드 사용 함수 정의:

    함수 정의 주위에 헤더 가드를 추가하여 함수 정의가 두 번 이상 정의되는 것을 방지할 수 있습니다.

    #ifndef OPERATOR_LT_LT_DEFINED
    #define OPERATOR_LT_LT_DEFINED
    
    std::ostream& operator<<(std::ostream& o, const Complex& Cplx) {
       return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
    }
    
    #endif // OPERATOR_LT_LT_DEFINED

위 내용은 여러 소스 파일에 함수 정의가 포함된 헤더 파일을 포함하면 \"다중 정의\" 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.