Umgang mit mehreren Headerdateien



  • Hallo liebe Community,

    ich programmiere nun schon seit Längerem C++, komme auch voran, aber es gibt eine Sache, die mir immer wieder im Weg steht und für die ich schon das ganze Internet durchforstet habe, aber nicht dazu gefunden habe.

    Nehmen wir mal an, man hat 2 .cpp-Dateien: 1.cpp und 2.cpp mit ihren Headerdateien, also 1.h und 2.h.
    Jetzt brauche ich Deklarationen von 1.h in 1.cpp UND 2.cpp.

    Ich habe versucht, die 1.h einfach in 1.cpp und 2.cpp zu inkludieren, aber dann bekomme ich die Fehlermeldung, dass es alle Deklarationen von 1.h zweimal gibt. Logische Schlussfolgerung: Man darf jede Headerdatei nur einmal inkludieren, oder?

    Ich habe es mit pragma once und Inkludeguards versucht, aber die hat man ja nur um eine Implementation einer Headerdatei zu verhindern, falls sie schon einmal irgendwo inkludiert wurde, aber das will ich ja nicht. Ich brauche eben die Deklarationen einer Headerdatei in mehreren .cpp, oder .h Dateien.

    Also mein Problem ist im ganz Allgemeinen mit mehreren Headerdateien zu arbeiten, die eigentlich mehrmals inkludiert werden müssten. Wie kann man das denn machen?

    Danke für alle Antworten! 🙂



  • @Coop4Free sagte in Umgang mit mehreren Headerdateien:

    schon das ganze Internet durchforstet habe

    Scherzkeks

    Ich habe versucht, die 1.h einfach in 1.cpp und 2.cpp zu inkludieren, aber dann bekomme ich die Fehlermeldung, dass es alle Deklarationen von 1.h zweimal gibt

    Nein!

    Ich habe es mit pragma once und Inkludeguards versucht, aber die hat man ja nur um eine Implementation einer Headerdatei zu verhindern, falls sie schon einmal irgendwo inkludiert wurde

    Was?

    Zeige Code. Copy&Paste Fehlermeldung.



  • This post is deleted!


  • @manni66

    Was ich hier z.B. machen will ist "s_word" aus Server.hpp mit "c_word" aus Client.cpp gleichzusetzen.

    //Client.cpp

    #include <iostream>
    #include <vector>
    #include <sstream>
    #include "Client.hpp"
    #include "Server.hpp"

    int executeClient() {
    c_word = s_word;
    std::cout << "32-bit Wert vom SRAe:" + c_word << std::endl;
    std::cout << "Werte:" << std::endl;
    splitInt(c_word);
    }

    //Client.hpp

    #include <array>
    #include <vector>

    //max 255 / Bit 1-8 / 8 Bits
    unsigned char c_label;
    //max 3 / Bit 9-10 / 2 Bits
    char c_sdi = 3;
    //max 65535 / Bit 11-26 / 16 Bits
    unsigned int c_entfernungswert;
    //max 1 / Bit 27 / 1 Bit
    bool c_lsb;
    //max 1 / Bit 28 / 1 Bit
    bool c_msb = 1;
    //max 0 / Bit 29 / 1 Bit
    bool c_nichtVerwendet;
    //max 3 / Bit 30 - 31 / 2 Bit
    char c_ssm;
    //max 1 / Bit 32 / 1 Bit
    bool c_parity;
    std::array<unsigned int, 8> c_tokens = {c_label, c_sdi, c_entfernungswert, c_lsb, c_msb, c_nichtVerwendet, c_ssm, c_parity};
    long long c_word;

    int executeClient();

    //Server.cpp

    #include <iostream>
    #include <array>
    #include <sstream>
    #include <string>
    #include "Server.hpp"
    #include "Client.hpp"

    int main() {
    executeServer();
    }

    void executeServer() {
    buildWord(s_word);
    executeClient();
    }

    void buildWord(long long &s_word) {
    std::stringstream ss;
    for(int i = 0; i < s_tokens.size(); i++) {
    ss << s_tokens[i];
    }
    s_word = std::stoll(ss.str());
    std::cout << s_word << std::endl;
    }

    //Server.hpp

    #include <array>

    //max 255 / Bit 1-8 / 8 Bits
    unsigned char s_label = 255;
    //max 3 / Bit 9-10 / 2 Bits
    char s_sdi = 3;
    //max 65535 / Bit 11-26 / 16 Bits
    unsigned int s_entfernungswert = 000;
    //max 1 / Bit 27 / 1 Bit
    bool s_lsb = 1;
    //max 1 / Bit 28 / 1 Bit
    bool s_msb = 1;
    //max 0 / Bit 29 / 1 Bit
    bool s_nichtVerwendet = 0;
    //max 3 / Bit 30 - 31 / 2 Bit
    char s_ssm = 3;
    //max 1 / Bit 32 / 1 Bit
    bool s_parity = 1;
    std::array<unsigned int, 8> s_tokens = {s_label, s_sdi, s_entfernungswert, s_lsb, s_msb, s_nichtVerwendet, s_ssm, s_parity};
    long long s_word;

    int main();
    void executeServer();
    void buildWord(long long &);



  • @manni66

    Hier ist die Fehlermeldung:

    c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.data+0x0): multiple definition of s_label'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.data+0x2): first defined here c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.data+0x1): multiple definition ofs_sdi'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.data+0x3): first defined here
    c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.bss+0x0): multiple definition of s_entfernungswert'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.bss+0x0): first defined here c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.data+0x2): multiple definition ofs_lsb'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.data+0x4): first defined here
    c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.data+0x3): multiple definition of s_msb'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.data+0x5): first defined here c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.bss+0x4): multiple definition ofs_nichtVerwendet'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.bss+0x4): first defined here
    c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.data+0x4): multiple definition of s_ssm'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.data+0x6): first defined here c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.data+0x5): multiple definition ofs_parity'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.data+0x7): first defined here
    c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.bss+0x20): multiple definition of s_tokens'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.bss+0x20): first defined here c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\PFAC\AppData\Local\Temp\ccy1Cl23.o:Server.cpp:(.bss+0x40): multiple definition ofs_word'; C:\Users\PFAC\AppData\Local\Temp\ccH5xr27.o:Client.cpp:(.bss+0x40): first defined here
    collect2.exe: error: ld returned 1 exit status
    The terminal process terminated with exit code: 1



  • @Coop4Free sagte in Umgang mit mehreren Headerdateien:

    //Client.hpp
    #include <array>
    #include <vector>
    //max 255 / Bit 1-8 / 8 Bits
    unsigned char c_label;

    unsigned char c_label; ist eine Definition und die hat nichts in einem Header zu suchen.

    extern unsigned char c_label; ist (nur) eine Deklaration. Die bracht aber irgendwo noch eine entsprechende Definition in einer .cpp Datei



  • @DirkB

    aber eine definition kann man doch nur mit extern davor verhindern. Aber mit extern sagt man doch nur in einer anderen Datei dass man diese Variable von der Datei, wo sie definiert wurde verwenden will. Also z.B:

    1.h enthält int x;
    2.cpp enthält extern x;

    damit kann man doch in 2.cpp mit dem int x von 1.h arbeiten



  • Du hast den Sinn von Headern nicht verstanden.

    Sie sind nicht dafür da, alle Variablen einer cpp-Datei darin zu definieren.

    Wenn du globale Variablen verwenden willst (blöde Idee), dann werden diese in einem Header extern deklariert. Genau eine cpp-Datei implementiert (=definiert) diese dann.



  • @Coop4Free sagte in Umgang mit mehreren Headerdateien:

    @DirkB

    aber eine definition kann man doch nur mit extern davor verhindern. Aber mit extern sagt man doch nur in einer anderen Datei dass man diese Variable von der Datei, wo sie definiert wurde verwenden will. Also z.B:

    1.h enthält int x;
    2.cpp enthält extern x;

    damit kann man doch in 2.cpp mit dem int x von 1.h arbeiten

    Das ist genau falsch rum.

    In eine Headerdatei gehören nur die Informationen, die andere .cpp brauchen um den Code zu benutzen.
    Das ist eine Schnittstelleninformation.


Log in to reply