Wo liegt der Fehler?
-
Hallo
ich habe heute meinen alten code ausgegraben, aber heute geht da nichts mehr - ich bekomme eine liste Fehlermeldugen voll, obwohl, meines erachtens nach, müsste es so funktionieren - hat auch früher funktioniert...
#include <exception> #include <errno.h> #include <cstring> class EErrno : public std::exception { public: virtual char* pError( ) const = 0; }; class ERead : public EErrno { private: int errno; public: ERead( int in_errno ): errno(in_errno) {} char* pError( ) const { return strerror( errno ); } };und nun bekomme ich diese lange liste an fehlern für diese paar zeilen:
g++ -o mini minitest.cc
minitest2.cc: In constructor ‘ERead::ERead(int)’:
minitest2.cc:16:32: error: anachronistic old-style base class initializer
minitest2.cc:16:32: error: no matching function for call to ‘EErrno::EErrno(int&)’
minitest2.cc:6:1: note: candidates are: EErrno::EErrno()
minitest2.cc:6:1: note: EErrno::EErrno(const EErrno&)
minitest2.cc:16:37: error: expected ‘{’ before ‘(’ token
minitest2.cc: In member function ‘virtual char* ERead::pError() const’:
minitest2.cc:17:50: error: passing ‘const ERead’ as ‘this’ argument of ‘int* ERead::__errno_location()’ discards qualifiersFällt jemanden was auf, was diese Fehler verursachen könnte?
Was mir noch zu denken gibt, dass <string> die strerror( ) Funktion nichtm ehr kennt, nur <cstring> bzw. <string.h>
-
Ja, das sind die Freuden der Makros.
Irgendwo in errno.h vergraben findest du folgende Zeile:
#define errno (*__errno_location ())Was mir noch zu denken gibt, dass <string> die strerror( ) Funktion nichtm ehr kennt, nur <cstring> bzw. <string.h>
Die kannte sie noch nie. Vergleiche:
cstring: http://www.cplusplus.com/reference/clibrary/cstring/
string: http://www.cplusplus.com/reference/string/
-
Aber wie kann man es zum laufen bringen? Zusätzlich soll das Programm nicht nur an eine System gebungen sein...
strerror ist sehr wohl bestandteil von <cstring>
Other:
strerror Get pointer to error message string (function)
strlen Get string length (function)
-
Feld schrieb:
strerror ist sehr wohl bestandteil von <cstring>
Aber nicht von <string> ! das eine ist die Biblitohek für oldscool C-Strings (also char-Arrays), das andere für die Klasse std::string.
Feld schrieb:
Aber wie kann man es zum laufen bringen? Zusätzlich soll das Programm nicht nur an eine System gebungen sein...
Am Besten implementierst du es mit ordentlichem, aktuellen (d.h. seit 1998 standardisiertem) C++ nochmal neu.
Oder benennst deine lokale Variable so um, dass sie vielleicht nicht genau wie das Makro aus den C-Bibliotheken heißt.
-
Danke, jetzt funktioniert es wieder

wenn strerror in <string> nicht mehr vorhanden ist, dann gibt es wohl eine neue Funktion die das gleiche macht? -Bei Socketprogrammierung kommt man um "errno" nicht rum und diese Funktion leistet gute dienste.
-
string ist ein ganz anderer Header als string.h! C++ ist nicht C!
-
Feld schrieb:
wenn strerror in <string> nicht mehr vorhanden ist, dann gibt es wohl eine neue Funktion die das gleiche macht?
- "nicht mehr" impliziert, dass sie mal vorhanden war. Es gab aber nie etwas in der Art in <string>
- <string> hat mit <cstring>/<string.h> so gut wie nichts zu tun. <string> ist C++, in C++ arbeitet man nicht mehr mit globalen error-Variablen, deshalb gibts dort auch nichts vergleichbares.
Du hast uns noch nicht genau gesagt, was du erreichen möchtest, nur angedeutet, was du tun möchtest, um das zu erreichen (das ist ein Unterschied!). Und du möchtest scheinbar nicht das richtige tun.
Feld schrieb:
Bei Socketprogrammierung kommt man um "errno" nicht rum und diese Funktion leistet gute dienste.
Ich korrigier das mal: die Socket-Bibliothek, die du benutzt, hat eine C-API und arbeitet mit "errno". Da kommt man sehr wohl drum rum, und zwar indem man entweder eine C++-Biblitohek für Sockets benutzt, oder indem man die C-API sauber mit einer C++-Schicht kapselt, in der du dann allerdings die C-Fehlerbehandlung ordentlich in eine C++-Fehlerbehandlung übersetzt.