Beheben die mehrfachen Definitionen eines Funktionsfehlers in C++

Muhammad Husnain 12 Oktober 2023
Beheben die mehrfachen Definitionen eines Funktionsfehlers in C++

In diesem Artikel geht es um die Lösung des häufig auftretenden Fehlers in C++, nämlich mehrere Definitionen einer Funktion.

Beheben den Fehler mehrere Definitionen einer Funktion in C++

Solche Fehler werden normalerweise verursacht, wenn wir versuchen, den Funktionsprototyp und seine Definition zu trennen. Daher wird empfohlen, die Prototypen und Definitionen in verschiedenen Dateien zu trennen und die Datei entsprechend einzubinden.

Betrachten Sie das folgende Beispiel, um das Problem zu verstehen.

Beispielcode (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;
}

Beispielcode (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;
}

Dies ist, was in Ihrer Situation passiert. Aufgrund von #include in der Datei file1.cpp enthalten sowohl file1.cpp als auch main.cpp eine Definition von f1(), und der Linker weiß nicht, welche er in Ihrer verwenden soll Programm und beschwert sich darüber.

Die Lösung besteht darin, die CPP-Datei mit der Definition von f1() aus main.cpp zu entfernen und stattdessen die Deklaration von f1() in eine separate Header-Datei aufzunehmen und diese in main.cpp einzufügen. Der Compiler muss sich mit der Deklaration von f1() auseinandersetzen, und der Linker hat nur eine Definition von f1() aus file1.cpp, auf die er sich verlassen kann.

Beispielcode (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; }
};

Beispielcode (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;
}

Beispielcode (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;
}

Beginnen wir mit der Header-Datei file1.h. Header-Dateien enthalten die Definitionen von allem wie Funktionsdefinitionen, Struktur- oder Klassendefinitionen oder Konstantendefinitionen.

Diese Erweiterung .h teilt dem Compiler mit, dass diese Datei nicht kompiliert werden soll. Es ist wie eine Textdatei und kann von jedem gelesen werden.

Dies impliziert, dass die Header-Datei eine Dokumentationsdatei ist. Wenn ein Programmierer in Zukunft einige Funktionen verwenden möchte, muss er nur den Prototyp der Funktionen überprüfen und muss nicht ins Detail über Funktionsdefinitionen gehen.

Schließlich sollte der Vorlagencode auch in der Header-Datei enthalten sein.

Die CPP-Datei definiert nun die in der Header-Datei deklarierte Funktion. Dies teilt dem Compiler mit, dass diese Datei kompiliert und in eine Binärdatei konvertiert werden soll.

Die Integrität Ihres Codes wird geschützt und niemand kann ihn ohne Ihre Erlaubnis ändern. Das bedeutet, dass diese Codetrennung auch die Sicherheit Ihrer Codedateien gewährleistet.

Ein weiterer Grund für diese Technik ist die Portabilität. Beispielsweise haben Sie einen binären Suchcode geschrieben, der später in vielen anderen Programmen verwendet werden kann.

Wenn Sie diese separaten Dateien für Funktionen haben, können Sie diese Funktionen problemlos in jedem anderen Projekt verwenden.

Schließlich enthält die Hauptdatei nur die Hauptfunktion und enthält oben die Header-Datei. Diese Datei enthält nur die Hauptfunktion, die nur alle Funktionen aufruft und sonst nichts.

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

Verwandter Artikel - C++ Error