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?
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:
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.
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
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
Tags und Links c++ include linker-errors