error LNK2005: "struct ist bereits definiert", trotz ifndef ??????



  • Hallo! Ich bekomme folgenden Fehler obwohl ich die Headerdatei mit ifndef deklariert habe.

    error LNK2005: "struct benutzer * b_anfang" (?b_anfang@@3PAUbenutzer@@A) ist bereits in shopsystem.obj definiert. anmeldung.obj

    Weis jemand woran das liegt?

    #ifndef BENUTZERSTRUKTUREN_H
    #define BENUTZERSTRUKTUREN_H
    
    	#include <stdio.h>
    
    	struct telefon
    	{
    		char vorwahl[11]; // String mit max 10 Stellen (11Byte)
    		unsigned long nummer; // Int bis 4.294.967.295 (4Byte)
    	};
    
    	struct datum
    	{
    		char tag[3]; // String mit max 2 Stellen (3Byte)
    		char monat[3]; // String mit max 2 Stellen (3Byte)
    		unsigned short jahr; // Int bis 65.535 (2Byte)
    	};
    
    	struct benutzer
    	{
    		unsigned long benutzernu; // Int bis 4.294.967.295 (4Byte)
    		char nachname[51]; // String mit max 50 Stellen (51Byte)
    		char vorname[51]; // String mit max 50 Stellen (51Byte)
    		char strasse[51]; // String mit max 50 Stellen (51Byte)
    		char nr[6]; // String mit max 5 Stellen (6Byte)
    		char ort[51]; // String mit max 50 Stellen (51Byte)
    		char plz[6]; // String mit max 5 Stellen (6Byte)
    		char land[51]; // String mit max 50 Stellen (51Byte)
    		struct telefon festnetz;
    		struct telefon handy;
    		struct telefon fax;
    		char email[51]; // String mit max 50 Stellen (51Byte)
    		struct datum geburtstag;
    		char passwort[51]; // String mit max 50 Stellen (51Byte)
    		unsigned short admin; // Int bis 65.535 (2Byte)
    		struct benutzer *naechster;
    	};
    
    	struct benutzer* b_anfang = NULL;
    	struct benutzer* b_aktuell = NULL;
    	struct benutzer* b_login = NULL;
    	struct benutzer* b_suche = NULL;
    
    #endif
    


  • Du darfst in Header-Dateien Variablen nur deklarieren, nicht definieren. Die Definition steht dann ein einer Source-Datei.

    extern struct benutzer* b_anfang;
    extern struct benutzer* b_aktuell;
    extern struct benutzer* b_login;
    extern struct benutzer* b_suche;
    

    Du darfst im übrigen Präprozessoranweisungen nicht vor dem # einrücken (laut MSDN).
    Und das ist C-Code, nicht C++ 😉



  • Danke für die schnelle Antwort, aber leider klappt das noch nicht ganz... 😞
    Jetzt meckern die ganzen Funktionen aus benutzerfunktionen.h das b_anfang, b_aktuell usw nicht deklarierte Bezeichner sind... 😢

    #include <stdio.h>
    #include "benutzerfunktionen.h"
    
    struct benutzer* b_anfang = NULL;
    struct benutzer* b_aktuell = NULL;
    struct benutzer* b_login = NULL;
    struct benutzer* b_suche = NULL;
    
    void main()
    {
        ...
    }
    
    #ifndef _BENUTZERFUNKTIONEN_
    #define _BENUTZERFUNKTIONEN_
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <ctype.h>
    #include <conio.h>
    
    #include "benutzerstrukturen.h"
    #include "grafikfunktionen.h"
    #define TRUE 1
    #define FALSE 0
    
    int BenutzerMenue(char *art);
    int Anmeldung();
    int BenutzerEinlesen(char *dateiname);
    void BenutzerKopieren(struct benutzer *von_person, struct benutzer *nach_person);
    void BenutzerAnhaengen(struct benutzer *tmp_person);
    void BenutzerSuchenNummer(unsigned long benutzernu);
    int BenutzerSuchenLogin(struct benutzer *tmp_person);
    void AlleBenutzerAusgeben();
    void BenutzerFree();
    
    #endif
    
    #ifndef BENUTZERSTRUKTUREN_H
    #define BENUTZERSTRUKTUREN_H
    
    #include <stdio.h>
    
    struct telefon
    {
    	char vorwahl[11]; // String mit max 10 Stellen (11Byte)
    	unsigned long nummer; // Int bis 4.294.967.295 (4Byte)
    };
    
    struct datum
    {
    	char tag[3]; // String mit max 2 Stellen (3Byte)
    	char monat[3]; // String mit max 2 Stellen (3Byte)
    	unsigned short jahr; // Int bis 65.535 (2Byte)
    };
    
    struct benutzer
    {
    	unsigned long benutzernu; // Int bis 4.294.967.295 (4Byte)
    	char nachname[51]; // String mit max 50 Stellen (51Byte)
    	char vorname[51]; // String mit max 50 Stellen (51Byte)
    	char strasse[51]; // String mit max 50 Stellen (51Byte)
    	char nr[6]; // String mit max 5 Stellen (6Byte)
    	char ort[51]; // String mit max 50 Stellen (51Byte)
    	char plz[6]; // String mit max 5 Stellen (6Byte)
    	char land[51]; // String mit max 50 Stellen (51Byte)
    	struct telefon festnetz;
    	struct telefon handy;
    	struct telefon fax;
    	char email[51]; // String mit max 50 Stellen (51Byte)
    	struct datum geburtstag;
    	char passwort[51]; // String mit max 50 Stellen (51Byte)
    	unsigned short admin; // Int bis 65.535 (2Byte)
    	struct benutzer *naechster;
    };
    
    #endif
    


  • Neku schrieb:

    extern struct benutzer* b_anfang;
    extern struct benutzer* b_aktuell;
    extern struct benutzer* b_login;
    extern struct benutzer* b_suche;
    

    Der Teil muss in der Header-Datei, um die Variablen nur zu deklarieren.



  • Hab ich gemacht... aber nun meckert er wegen Mehrfachinitialisierung! Ich verstehe das nicht 😢

    error C2374: 'b_anfang': Neudefinition; Mehrfachinitialisierung
    error C2374: 'b_aktuell': Neudefinition; Mehrfachinitialisierung
    error C2374: 'b_login': Neudefinition; Mehrfachinitialisierung
    error C2374: 'b_suche': Neudefinition; Mehrfachinitialisierung

    #include <stdio.h>
    #include "benutzerfunktionen.h"
    
    struct benutzer* b_anfang = NULL;
    struct benutzer* b_aktuell = NULL;
    struct benutzer* b_login = NULL;
    struct benutzer* b_suche = NULL;
    
    void main()
    {
    ...
    }
    
    #ifndef BENUTZERSTRUKTUREN_H
    #define BENUTZERSTRUKTUREN_H
    
    #include <stdio.h>
    
    struct telefon
    {
    	char vorwahl[11]; // String mit max 10 Stellen (11Byte)
    	unsigned long nummer; // Int bis 4.294.967.295 (4Byte)
    };
    
    struct datum
    {
    	char tag[3]; // String mit max 2 Stellen (3Byte)
    	char monat[3]; // String mit max 2 Stellen (3Byte)
    	unsigned short jahr; // Int bis 65.535 (2Byte)
    };
    
    struct benutzer
    {
    	unsigned long benutzernu; // Int bis 4.294.967.295 (4Byte)
    	char nachname[51]; // String mit max 50 Stellen (51Byte)
    	char vorname[51]; // String mit max 50 Stellen (51Byte)
    	char strasse[51]; // String mit max 50 Stellen (51Byte)
    	char nr[6]; // String mit max 5 Stellen (6Byte)
    	char ort[51]; // String mit max 50 Stellen (51Byte)
    	char plz[6]; // String mit max 5 Stellen (6Byte)
    	char land[51]; // String mit max 50 Stellen (51Byte)
    	struct telefon festnetz;
    	struct telefon handy;
    	struct telefon fax;
    	char email[51]; // String mit max 50 Stellen (51Byte)
    	struct datum geburtstag;
    	char passwort[51]; // String mit max 50 Stellen (51Byte)
    	unsigned short admin; // Int bis 65.535 (2Byte)
    	struct benutzer *naechster;
    };
    
    extern struct benutzer* b_anfang = NULL;
    extern struct benutzer* b_aktuell = NULL;
    extern struct benutzer* b_login = NULL;
    extern struct benutzer* b_suche = NULL;
    
    #endif
    


  • Dann such mal den Unterschied zwischen Neku's extern-Deklarationen und Deinen...



  • Danke Euch beide... da hab ich gesucht und gefunden! 🙂


Anmelden zum Antworten