#ifndef in Headerdatei



  • Hi,

    die Headerdatei cursor.h brauche ich in 2 Sourcedateien und beim Linken bekomme ich die Fehlermeldung:

    1>------ Erstellen gestartet: Projekt: 2009-06-09UmsatzAuswertung, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>maske_konto.cpp
    1>Verknüpfen...
    1>masken.obj : error LNK2005: "struct _CONSOLE_SCREEN_BUFFER_INFO strConsoleInfo" (?strConsoleInfo@@3U_CONSOLE_SCREEN_BUFFER_INFO@@A) ist bereits in maske_konto.obj definiert.
    1>masken.obj : error LNK2005: "void * hConsole" (?hConsole@@3PAXA) ist bereits in maske_konto.obj definiert.
    1>masken.obj : error LNK2005: "struct _COORD Home" (?Home@@3U_COORD@@A) ist bereits in maske_konto.obj definiert.
    ...
    ...
    1>2009-06-09UmsatzAuswertung - 4 Fehler, 0 Warnung(en)

    beim Versuch mit #define :

    // "cursor.h"
    #include <windows.h>
    #include <conio.h>
    using namespace std;
    #ifndef MYFILE_H
    #define MYFILE_H
    HANDLE hConsole;
    COORD Home;
    CONSOLE_SCREEN_BUFFER_INFO strConsoleInfo;
    #endif

    besteht das Problem weiterhin.
    Ich glaube, dass ich diese Präprozessor-Direktiven nicht verstehe.
    Könnte mir Jemand dabei helfen ?
    Vielen Dank



  • Der include guard könnte nach ganz außen (also auch über die includes), außerdem sollte das using namespace std da verschwinden. Trotzdem denke ich, dass es eigentlich so funktionieren sollte. Hast du vielleicht in einem anderen Header bereits MYFILE_H definiert? Dieses define sollte am besten einen zur Datei passenden Namen bekommen und natürlich auch nur da verwendet werden.


  • Administrator

    Die Headerguards verhindern nur die Mehrfachdefinition in einer TU, sie dienen nur zum Verhindern von Kompilerfehlern. Wenn du mehrere TUs hast, dann wird auch mehrmals der Präprozessor gestartet, also hast du trotzdem die Objekte mehrmals.

    Am sinnvollsten wäre, wenn du komplett auf globale Objekte verzichten würdest. Falls du aus unerklärlich Gründen nicht auf diesen sinnvollen Tipp eingehen willst, kannst du auch die Objekte mit extern kennzeichnen und in nur einer TU definieren.

    Zusätzliche Tipps:
    - Nimm using namespace std; aus dem Header. Das ist ein ganz schlechter Stil.
    - Nimm die includes in den Guard Bereich rein. Beschleunigt je nach dem etwas den Präprozessor.

    Grüssli



  • Hast natürlich Recht, Dravere. Ich mach sowas nie, daher sah das grundsätzlich erstmal gut aus... 🤡



  • Danke _matze,
    danke Dravere,

    jetz ist OK.

    lg
    vladimir


Anmelden zum Antworten