>백엔드 개발 >C++ >헤더 파일에 함수를 정의하면 C에서 \'다중 정의\' 오류가 발생하는 이유는 무엇입니까?

헤더 파일에 함수를 정의하면 C에서 \'다중 정의\' 오류가 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-19 07:00:03968검색

Why Does Defining a Function in a Header File Cause a

왜 헤더에 기호를 다중 정의해야 하나요?

여러 헤더 파일이 포함된 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&amp; operator<<(std::ostream&amp; o, const Complex&amp; 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&amp; operator<<(std::ostream&amp; o, const Complex&amp; 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&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
  • 연산자 이동<< 구현 파일에 정의:
// complex.cpp
...
std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...

함수를 인라인하거나 구현 파일에 해당 정의를 배치하면 다중 정의 오류를 방지하여 프로그램이 성공적으로 컴파일되도록 할 수 있습니다.

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

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