Hallo ihr lieben,
ich habe leider bei meinen Hobbyprogrammieren ein Problem mit den
Headerdateien.
Ich habe leider aus speicherplatzgründen eine Klasse in einzelne
Funktionen auflösen müssen, da der Arbeitsspeicher und Flashspaicher
nicht ausreichend ist.
Desshalb möchte ich in den namensraum std einfach ein paar Funktionen
haben.
Innerhalb der Funktionen lese und schribe ich mehrmals in vershiedene
Variablen aus den Nahmensraum.
Leider schaffe ich es nicht die Variablen und Funktionen in einer Header
Datei zu hinderlegen.
Die Beispiele und tutorials haben bei mir auch nichts geholfen, da sie
lediglich das Problem im Kontext von Klassendefinitionen abhandeln.
Die Fehlermeldungen sind:
../Core/Src/Parser.cpp:1411:29: error: call of overloaded
'IsNumeric(char*&)' is ambiguous
../Core/Src/Parser.cpp:1438:35: error: call of overloaded
'strToU32(char*&)' is ambiguous
../Core/Src/Parser.cpp:1443:38: error: call of overloaded
'IsNumeric(char*&)' is ambiguous
../Core/Src/Parser.cpp:1468:31: error: call of overloaded
'IsNumeric(char*&)' is ambiguous
../Core/Src/Parser.cpp:1469:36: error: call of overloaded
'strXToU32(char*&)' is ambiguous
../Core/Src/Parser.cpp:1474:39: error: call of overloaded
'IsNumeric(char*&)' is ambiguous
Hat jemand ein Tipp wie ich die Fehlermeldungen beseitigen kann?
Leider hat es mit extern deklaratonen wie in C üblich nicht fuktioniert.
Genau so wie wenn ich versuche die Probleme mit std:: auf zu lösen.
Dann bekomme ich 'multiple definition' Fehler.
Parser.cpp
Philip schrieb:> Desshalb möchte ich in den namensraum std einfach ein paar Funktionen> haben.
Das ist nicht erlaubt. Aber was hält dich davon ab einen eigenen auf zu
machen?
Philip schrieb:> using namespace std;
Das solltest du dir ganz ganz schnell abgewöhnen.
Die Fehler stecken in den Zeilen ab 1411. Dein Quellcode zeigt die
nicht. Dazu schreibst du von Problemen mit Header-Dateien, zeigst aber
eine .cpp
Wie soll man da helfen?
Und als letztes steht über jedem Beitrag in Fett:
> Wichtige Regeln - erst lesen, dann posten!> Groß- und Kleinschreibung verwenden> Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Bevor du jetzt hier 2000 Zeilen in das Textfeld ballern willst.
Oliver
Ich habe hier nicht nur eine *.cpp Datei gekürz eingestellt sondern
darunter auch die *.hpp Datei (ungekürzt) also erst lesen.
Die Fehlermeldungen habe ich leider vergessen an den gekürzten Inhalt
anzupassen...
Inzwischen habe ich wie von Mombert H vorgeschagen das ganze in ein
eigenen Namensraum verschoben.
Dadurch haben sich die Fehlermeldungen geändert:
../Core/Src/Parser.cpp:126:32: error: call of overloaded
'strToU16(char*&)' is ambiguous
../Core/Src/Parser.cpp:130:29: error: call of overloaded
'IsNumeric(char*&)' is ambiguous
../Core/Src/Parser.cpp:153:30: error: call of overloaded
'IsNumeric(char*&)' is ambiguous
../Core/Src/Parser.cpp:154:35: error: call of overloaded
'strToU32(char*&)' is ambiguous
../Core/Src/Parser.cpp:158:38: error: call of overloaded
'IsNumeric(char*&)' is ambiguous
(Die Zeilennummern sind an den gekürzten Code angepasst).
Philip schrieb:> Hat jemand ein Tipp wie ich die Fehlermeldungen beseitigen kann?
In deiner hpp-Datei sind die Funktionen im Namespace, in der cpp-Datei
sind sie außerhalb davon.
Philip schrieb:> Ich habe hier nicht nur eine *.cpp Datei gekürz eingestellt sondern> darunter auch die *.hpp Datei (ungekürzt) also erst lesen.
Es ging darum, dass du so langen Code nicht inline in dein Posting
stecken sollst, sonst als separate Dateien anhängen.
Bei mir verschwinden die Fehler wenn ich die Funktionen mit dem Schema
'Namensraum::Funktionsname(){}' definiere.
Klingt ja Logisch...
Leider habe bekomme ich statt dessen 'multiple definition of' Fehler:
c:\st\stm32cubeide_1.3.0\stm32cubeide\plugins\com.st.stm32cube.ide.mcu.e
xternaltools.gnu-tools-for-stm32.9-2020-q2-update.win32_2.0.0.2021053113
46\tools\arm-none-eabi\bin\ld.exe:
./Core/Src/maincpp.o:(.bss._ZN6Parser14StmTriggerLoadE+0x0): multiple
definition of `Parser::StmTriggerLoad';
./Core/Src/Parser.o:(.bss._ZN6Parser14StmTriggerLoadE+0x0): first
defined here
Für die folgenden Variablen in einer Funktion aus maincpp.cpp.
In der Datei habe ich die Datei Parser.hpp includiert.
1
Parser::contentXml=nullptr;
2
Parser::contentXml_Load=0;
3
Parser::BytePtr=nullptr;
4
Parser::StringPtr=nullptr;
5
Parser::StringLen=0;
6
Parser::MemByte=0;
7
Parser::StmLoop=nullptr;
8
Parser::StmLoopLoad=0;
9
Parser::StmTrigger=nullptr;
10
Parser::StmTriggerLoad=0;
Die einzige Definition von den Variablen habe habe ich in der
Headerdatei Parser.hpp gemacht.
Header guards sind ja gundlegender Standart bei der Programmierung mit C
und C++.
Unter C hätte ich in der Headerdatei in ähnlichen Kontext einfach den
Prototypen extern vorangestellt.
Ähnliches habe ich unter C++ noch nicht gesehen...
Philip schrieb:> Die einzige Definition von den Variablen habe habe ich in der> Headerdatei Parser.hpp gemacht.> Header guards sind ja gundlegender Standart bei der Programmierung mit C> und C++.>> Unter C hätte ich in der Headerdatei in ähnlichen Kontext einfach den> Prototypen extern vorangestellt.> Ähnliches habe ich unter C++ noch nicht gesehen...
Du solltest dir ein Ordentliches Buch zulegen und lesen. Der Unterschied
zwischen Definition und Deklaration ist ein ziemlich wichtiges Konzept
in C und C++.
Philip schrieb:> Die einzige Definition von den Variablen habe habe ich in der> Headerdatei Parser.hpp gemacht.> Header guards sind ja gundlegender Standart bei der Programmierung mit C> und C++.
Ja, und daher wird pro Objektdatei die fragliche Funktion nur einmal
erzeugt. Was für den Linker dann immer noch viel zu viele sind, so daß
der sich zu Recht beschwert.
Da du aber immer ich nicht den Code zeigst, der zu den Fehlermeldungen
passt, musst du halt weiter rätseln.
Oliver
Philip schrieb:> Die einzige Definition von den Variablen habe habe ich in der> Headerdatei Parser.hpp gemacht.
Da gehört sie aber nicht hin. Dort darf nur die Deklaration hin, nicht
die Definition.
> Header guards sind ja gundlegender Standart bei der Programmierung mit C> und C++.
Die helfen nur gegen mehrfaches Einbinden in der selben .cpp-Datei.
> Unter C hätte ich in der Headerdatei in ähnlichen Kontext einfach den> Prototypen extern vorangestellt.
Genau das musst du in C++ auch tun.
Hallo,
Sorry habe die Begriffe Definition und Deklaration verwechselt...
Peinlich wenn man das den Kollegen immer vorhält wenn ihnen das
passiert.
Ich habe mich in C++ schon eingelesen, aber mir in den Fall nicht viel
herleiten können.
Leider habe ich bei der Suche im Internet keine für mich
nachvollziehbare Beispiele hierfür gefunden, daraufhin habe ich nach
lösungen von ähnlichen Problemen in den KiCad Code gesucht, aber auch da
nichts gefunden...
Wenn ich wie im letzten Beitrag vorgeschlagen in dem Headerfile das
schlüsselwort extern einfüge steigt die Anzahl der Fehler bei den
versuch zu Kompilieren auf 42 an.
Für die Variablen ist jeweils die Fehlermeldung "undefined reference to
'Parser::Variablenname'".
Grüße
Philip
Philip schrieb:> Ok das ist dann doch ein Rückschritt zu C...> Da reichen die extern Deklarationen in den Headerfiles einfach aus.
Nein.
In einer .C Datei muss die Variable definiert werden.
Sonst gibt es ja nur Deklarationen.
Philip schrieb:> Ok das ist dann doch ein Rückschritt zu C...> Da reichen die extern Deklarationen in den Headerfiles einfach aus.
Nein. Auch in C muss die Variable definiert sein. "extern" heißt, dass
die Variable irgendwo anders definiert ist. Damit das funktioniert, muss
sie auch irgendwo anders definiert sein. Das ist in C und C++ gleich.
Ok vielen Dank euch!
Ich das ist jetzt der Punkt bei dem es bei mir gehangen hat...
Ich weis das in C streng genommen das auch so ist mir Deklaration und
extern Deklaration, wobei bei mir sich die Compiler noch nicht beschwert
haben wen ich lediglich extern deklarationen erstellt habe.
Beruflich habe ich mit den Sprachen C und Matlab M-Script / Simulink
zutuhen.
Bei C eigendlich sogar in zeimliche Tiefe da ich regelmäsig statische
Code Analysen auswerte...
Grüße
Philip
Philip schrieb:> Beruflich habe ich mit den Sprachen C und Matlab M-Script / Simulink> zutuhen.> Bei C eigendlich sogar in zeimliche Tiefe da ich regelmäsig statische> Code Analysen auswerte...
Das klingt jetzt dann doch etwas überraschend. Was für Produkte sind das
denn?
Oliver
Eine eigene Frage?
Dieser Thread ist über 4 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.