Seite 1 von 5

Multiple definitions

Verfasst: So Jan 10, 2010 7:16 pm
von naums
Ein Fehler passiert in folgender Headerfile:

Code: Alles auswählen

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;

void gotoxy(int x, int y)
{
    printf("\033[%d;%dG", y, x);
}

void home()
{
    int x[2] = {0,0};
    printf("\033[%d;%dG",x[1],x[2]);
}

void writehead(string header, string filepath)
{
    FILE *ini;
    ini=fopen(filepath.c_str(),"t");
    fprintf(ini,header.c_str());
    fclose(ini);
}
Fehler:
"Multiple Definition of gotoxy(int, int)"
"First declared here" --> zeigt auf Zeile 7

"Multiple Definition of home()"
"First declared here" --> zeigt auf Zeile 12

"Multiple Definition of writehead(std::basic_string<char, std::char_traits<char>, std::allocator<..."
"First declared here" --> zeigt auf Zeile 18

(... zeigt an dass es dann noch weiter geht, mehr Parameter als meine writehead function)

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:27 pm
von Jside
include guards ins Headerfile:

Code: Alles auswählen

#ifndef NAME_DES_HEADERS_H
#define NAME_DES_HEADERS_H

/* hier code */

#endif
Oder dem gcc den Parameter:
-Xlinker -zmuldefs
anhängen.

Ersteres bevorzugt.

Es ist übrigends keine gute idee in ein Headerfile ein "using namsepace XYZ;" zu schreiben ;)

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:28 pm
von AnGaiNoR
Sowas liegt eigentlich immer daran, dass der Header irgendwo zweimal eingebunden wird. Das geschieht meistens unabsichtlich, aber das kann man umgehen.

Code: Alles auswählen

#ifndef _NAME_DES_HEADERS_HPP_
#define _NAME_DES_HEADERS_HPP_

// hier kommt der eigentlich Header hin

#endif
Beim Kompilieren wird getestet, ob der Header schon eingebunden wurde, also ob schon die Präprozessor-Konstante für den Header gesetzt wurde. Wenn das nicht der Fall ist, dann wird der Header eingebunden und die Konstante gesetzt; ansonsten wird der Header ignoriert.
Das gleiche Schema findest du auch in so ziemlich jedem Header von Programm-Bibliotheken, Standard-Bibliotheken, usw.

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:31 pm
von naums
Warum sollte ich das mit dem Define tun? Und das Problem bleibt bestehen... trotzdem. Ohne std, und mit dem define.

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:33 pm
von AnGaiNoR
naums hat geschrieben:Warum sollte ich das mit dem Define tun?
Weil es jeder so macht ;)
naums hat geschrieben:Und das Problem bleibt bestehen...
Dann hast du was falsch gemacht.

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:39 pm
von cloidnerux
Und das Problem bleibt bestehen... trotzdem. Ohne std, und mit dem define.
Du musst bei dem #ifndef und #define das gleiche stehen haben, ansonsten nutzt dir das überhaupt nichts.
Außerdem ist es schlechter Stil, in Headerdateien die Funktionen zu Deklarieren.
Und in wie fern bleibt dien problem bestehen? Keine änderungen an den Ausgaben des Compilers?

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:40 pm
von naums

Code: Alles auswählen

#ifndef Linux_Console
#define Linux_Console
#include <stdlib.h>
#include <stdio.h>
#include <iostream>


void gotoxy(int x, int y)
{
    printf("\033[%d;%dG", y, x);
}

void home()
{
    int x[2] = {0,0};
    printf("\033[%d;%dG",x[1],x[2]);
}

void writehead(string header, string filepath)
{
    FILE *ini;
    ini=fopen(filepath.c_str(),"t");
    fprintf(ini,header.c_str());
    fclose(ini);
}
#endif
genau, die gleichen Ausgaben des Compilers. Aber warum ist das schlechter stil?

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:49 pm
von AnGaiNoR
Im Header (englisch für Kopfball, aber hier gehts jetzt mal nur um Kopf, Endung h/hpp/hxx) geht es darum Funktionsköpfe zu vereinbaren.
Die Funktionsrümpfe werden in den Quellcode-Dateien geschrieben (Endung c/cpp/cxx).

Bindet nun eine Datei den Header ein, dann ist die Existenz der darin deklarierten Funktionen bekannt; der Funktionsrumpf ist in dem Moment erstmal egal. Beim Zusammenfügen der einzelnen Teilquellen sorgt der Linker dann dafür, dass der eingebundene Funktionskopf dann auch auf den richtigen Rumpf verweist. Das klappt natürlich nicht, wenn der Rumpf mehrere Male da ist ("multiple definition"), oder auch wenn er gar nicht da ist ("undefined reference").

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:54 pm
von cloidnerux
genau, die gleichen Ausgaben des Compilers.
Kann es sein, das du die Funktionen auch für Windows geschrieben hast, mit den selben Namen, und diese Datei dann auch mit einbindest?

Re: Multiple definitions

Verfasst: So Jan 10, 2010 7:57 pm
von naums
schuldigung, die Datei heißt Console.cpp. Sorry, ich dachte auch das wäre eine Headerfile, ist aber eben nur der Quellcode... eben eine cpp.