S
In C++ darf alles (Klassen, Funktionen, Variablen, etc.) nur exakt einmal definiert sein (One-Definition-Rule).
Wenn du ein- und dieselbe Funktion in einem Programm mehrfach vorkommen hast, dann meldet der Linker (nicht schon der Compiler!) dir einen Fehler, genau das hast du gerade.
Woher kommt das?
Du hast deine Functions.cpp Datei, wo alles Funktionen definiert sind. Und diese Datei bindest du in deine main.cpp Datei ein. Ein #include wirkt da auf Textersetzungsebene, was bedeutet, dass der Inhalt von der inkludierten Datei einfach so anstelle des incldues eignefügt wird -> deine main.cpp beinhaltet nun den Code von Functions.cpp und von main.cpp. D.h. der Compiler kriegt die die Functions.cpp und compiliert zu einer Objektdatei (Functions.obj); und er kriegt die main.cpp und kompiliert sie zu main.obj. Und da include einfach nur Textersetzung war, stehen jetzt in der Functions.obj jeweils deine Funktion und auch in der main.obj. Und wenn der Linker beide Objektdateien zusammen linken will zu dem finalen Programm, dann sieht er, dass es da mehrere gleiche Funktionen gibt, was halt ein Fehler ist.
Was ist die Lösung:
In C++ unterscheidet man zwischen Deklaration und Definition. Deklaration ist das Bekanntmachen von Dingen (Klasse, Funktion, Variable...) und Definition das eigentliche Anlegen, sozusagen.
Beispiel:
// Deklaration
class Klasse;
void foo(int, double);
extern long global_variable;
// Definition
class Klasse
{
int a, b;
// ...
};
void foo(int i, double d)
{
// ...
}
long global_variable = 5;
Und aus dem Grund gibt es das Konzept der Header- und Implementationsdateien.
In den Header schreibt man die Deklarationen, die man in anderen Übersetzungseinheiten braucht und bindet (includiert) sie nämlich genau auch dort, wo man sie braucht. Und in den Implementationsdateien werden die eigentlichen Implementierungen abgelegt. Dabei gilt gewöhnlich, dass Implementationsdatei = Übersetzungseinheit.