C++에서 함수 오류의 다중 정의 수정

Muhammad Husnain 2023년10월12일
C++에서 함수 오류의 다중 정의 수정

이 문서는 함수의 다중 정의인 C++에서 자주 발생하는 오류에 대한 솔루션입니다.

C++에서 함수의 다중 정의 오류 수정

이러한 오류는 일반적으로 함수 프로토타입과 해당 정의를 분리하려고 할 때 발생합니다. 따라서 프로토타입과 정의를 서로 다른 파일로 분리하고 그에 따라 파일을 포함하는 것이 좋습니다.

문제를 이해하려면 아래 예를 고려하십시오.

예제 코드(file1.cpp):

// file1.cpp
#include <iostream>
using namespace std;

class classB {
  friend void f1();

 public:
  classB(int i = 1, int j = 2) : a(i), b(j) {
    cout << "Hello from constructor\n";
  }

 private:
  int a;
  int b;
  void printfun() { cout << "a=" << a << endl << "b=" << b << endl; }
};
void f1() {  // ERROR HERE
  cout << "f1 start" << endl;
  classB tmp(3, 5);
  tmp.printfun();
  cout << "f1 end" << endl;
}

예제 코드(main.cpp):

// main.cpp
#include <iostream>

#include "file1.cpp"
using namespace std;

int main() {
  cout << "calling function" << endl;
  f1();
  cout << "exit from main" << endl;
  return 0;
}

이것은 당신의 상황에서 일어나고 있는 일입니다. file1.cpp 파일의 #include 때문에 file1.cppmain.cpp에는 f1()의 정의가 포함되며 링커는 프로그램에 대해 불평하고 있습니다.

해결책은 main.cpp에서 f1() 정의가 포함된 CPP 파일을 제거하고 대신 별도의 헤더 파일에 f1() 선언을 포함하고 main.cpp에 포함하는 것입니다. 컴파일러는 처리할 f1() 선언을 갖고 링커는 file1.cpp에서 f1()에 대한 정의를 하나만 사용합니다.

예제 코드(file1.h):

// file1.h
#include <iostream>

class classB {
  friend void f1();

 public:
  classB(int i = 1, int j = 2) : a(i), b(j) {
    std::cout << "Hello from constructor\n";
  }

 private:
  int a;
  int b;
  void printfun() { std::cout << "a=" << a << endl << "b=" << b << std::endl; }
};

예제 코드(file1.cpp):

// file1.cpp
#include "file1.h"
using namespace std;
void f1() {
  cout << "f1 start" << endl;
  classB tmp(5, 6);
  tmp.printfun();
  cout << "f1 end" << endl;
}

예제 코드(main.cpp):

// main.cpp
#include <iostream>

#include "file1.h"
using namespace std;

int main() {
  cout << "calling function" << endl;
  f1();
  cout << "exit from main" << endl;
  return 0;
}

헤더 파일 file1.h부터 시작하겠습니다. 헤더 파일에는 함수 정의, 구조체 또는 클래스 정의 또는 상수 정의와 같은 모든 것에 대한 정의가 포함되어 있습니다.

.h 확장자는 이 파일이 컴파일되지 않음을 컴파일러에 알립니다. 텍스트 파일과 같으며 누구나 읽을 수 있습니다.

이것은 헤더 파일이 문서화 파일임을 의미합니다. 프로그래머가 미래에 일부 기능을 사용하려면 기능의 프로토타입만 확인하면 되며 기능 정의에 대해 자세히 설명할 필요가 없습니다.

마지막으로 템플릿 코드도 헤더 파일에 있어야 합니다.

CPP 파일은 이제 헤더 파일에 선언된 함수를 정의합니다. 이것은 컴파일러에게 이 파일이 컴파일되고 바이너리 파일로 변환될 것임을 알려줍니다.

코드의 무결성이 보호되며 다른 사람이 귀하의 허가 없이 수정할 수 없습니다. 이는 이러한 코드 분리가 코드 파일의 보안도 보장한다는 것을 의미합니다.

이 기술의 또 다른 이유는 이식성입니다. 예를 들어, 다른 많은 프로그램에서 나중에 사용할 수 있는 이진 검색 코드를 작성했습니다.

함수에 대해 이러한 별도의 파일이 있으면 다른 프로젝트에서 이러한 함수를 쉽게 사용할 수 있습니다.

마지막으로 메인 파일은 메인 함수만 포함하고 맨 위에 헤더 파일을 포함합니다. 이 파일에는 모든 함수만 호출하고 다른 것은 호출하지 않는 기본 함수만 포함되어 있습니다.

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

관련 문장 - C++ Error