Funktion bereits definierter Fehler in C ++

8

Ich habe eine Datei namens "SimpleFunctions.h" wie folgt definiert:

%Vor%

Diese Datei war zuvor nur in einer Datei enthalten und es funktionierte gut.

Heute habe ich es in eine zweite Datei aufgenommen und es funktioniert nicht mehr. Zur Verbindungszeit sagt es mir, dass die Funktion bereits in "firstfile.obj" definiert ist.

Da ich jedoch include guards verwende, würde ich erwarten, dass die Funktionen nur einmal definiert werden, oder fehlt mir etwas?

    
this.lau_ 06.08.2011, 04:41
quelle

3 Antworten

18

Diese Funktionen haben standardmäßig eine externe Verknüpfung. Das bedeutet, dass jede Übersetzungseinheit Funktionen namens double round (double r) und float round (float r) hat, was eine Namenskollision zur Verknüpfungszeit verursacht.

Einige mögliche Lösungen sind:

  1. Deklarieren Sie die Funktionen als statisch, was eine interne Verknüpfung
  2. bedeutet
  3. Inline die Funktionen
  4. Verschieben Sie die Implementierung aus dem Header und in eine c / c ++ - Datei

Lesen Sie hier mehr: Was sind externe Verknüpfungen und interne Verknüpfungen?

Übrigens schützen Wächter eine einzelne Übersetzungseinheit davor, eine Header-Datei mehrfach einzubinden. Das ist ein anderes Problem als das, was Sie hier sehen.

    
pepsi 06.08.2011, 05:21
quelle
2

verwende 'inline'

%Vor%

Der Compiler wird den Code nicht notwendigerweise inline einbinden (obwohl dies für diese kurze Funktion der Fall sein kann), aber der Linker behandelt nicht mehr als separate Funktion.

Hinweis - Include-Wächter verhindern, dass dieselbe Include-Datei mehr als einmal in derselben Quelldatei enthalten ist (genau genommen 'Kompilierungseinheit'), sie verhindert nicht, dass sie in separaten Quelldateien enthalten ist, die miteinander verknüpft sind. Deshalb deklarieren Sie es normalerweise in einem Header, aber definieren Sie die Funktion in einer c-Datei

    
Martin Beckett 06.08.2011 04:46
quelle
1

Eine bessere Möglichkeit, das Problem zu lösen, sind Vorlagen. Ihr Code wird gut kompiliert, wenn Sie etwas wie folgt tun sollten:

%Vor%

Ihr Linker hört auf sich zu beschweren und Sie haben eine einzige Funktion für alle Ihre Bedürfnisse.

Diese Lösung kann mit Typeigenschaften verbessert werden. Siehe boost :: is_floating_point und boost :: enable_if

    
David Stone 06.08.2011 05:15
quelle

Tags und Links