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.
-
Dieser Beitrag wurde gelöscht!
-
@manni66
Was ich hier z.B. machen will ist "s_word" aus Server.hpp mit "c_word" aus Client.cpp gleichzusetzen.
#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);
}#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();
#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;
}#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 of
s_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 ofs_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 of
s_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 ofs_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 of
s_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 ofs_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 of
s_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 ofs_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 of
s_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
-
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:
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.