error: declaration of 'int rand()' throws different exceptions
-
Tag, ich versuche gerade, bei einem Programm ein wenig weg von den C-includes zu kommen. alles was ich finden konnte, wurde auf die c*-includes (cstdlib etc.) umgstellt.
Das Programm ueberlaedt die Funktionen rand und srand, Deklaration:#include <cstdlib> #undef rand #undef srand int rand(); void srand(int a=0, int b=0, int c=0); ... using namespace std;Wenn ich das jetzt compilieren moechte, erhalte ich folgende Fehlermeldung:
GCC 4.3 schrieb:
random.cpp: In function 'int rand()':
random.cpp:137: error: declaration of 'int rand()' throws different exceptions
prots.h:17: error: from previous declaration 'int rand() throw ()'Damit bin ich nun ueberfordert. Hat jemand einen tipp?
Es bringt auch nichts, wenn man "using namespace std;" vor die includierung und definition setzt
Urspruenglich hatte die Datei _vor_ der includierung von cstdlib diese Definitionen:
#define rand hide_this_function #define srand hide_this_function2Die habe ich entfernt, damit er nicht schon vorher mit[quote="G++ 4.3]/usr/include/c++/4.3/cstdlib:131: error: '::rand' has not been declared
/usr/include/c++/4.3/cstdlib:133: error: '::srand' has not been declared[/quote]abbricht.System: Debian Sid
Compiler: G++ 4.3C167
-
C167 schrieb:
Tag, ich versuche gerade, bei einem Programm ein wenig weg von den C-includes zu kommen. alles was ich finden konnte, wurde auf die c*-includes (cstdlib etc.) umgstellt.
Das Programm ueberlaedt die Funktionen rand und srandWas genau willst du machen?
Das was du tust ist einfach nicht sinnvoll...
-
C167 schrieb:
Das Programm ueberlaedt die Funktionen rand und srand, Deklaration:
#include <cstdlib> #undef rand #undef srand int rand(); void srand(int a=0, int b=0, int c=0); ... using namespace std;Das ist unzulässig (zumindest bzgl. rand). Auch mit <cstdlib> darf eine Implementation die betreffenden Deklarationen zusätzlich im globalen Namensraum deklarieren. Spätestens nach dem using namespace std könntest du die Funktionen ohne Qualifikation ohnehin nicht mehr verwenden.
-
ich hab die ganze sache inzwischen ein wenig aufgedroeselt:
#define rand hide_this_function #define srand hide_this_function2 #include <stdlib.h> #undef rand #undef srand int rand(); void srand(int a=0, int b=0, int c=0); #endifWas hier passiert: die Funktionen werden umbenannt, auch in der header Datei. Dannach werden die Makros geloescht, aber die Funktionen bleiben umbenannt. so wurden die Funktionen re-definiert und ueber die neuen Namen kann man notfalls noch auch die alten Funktionen zurueckgreifen.
@Shade Of Mine: Ganz einfach: lernen
Bezieht sich das "nicht sinnvoll" aufs ueberladen oder aufs umstellen?
ich hab versucht, das nun auch zu realisieren, zumindest sagt er jetzt nicht mehr
/usr/include/c++/4.3/cstdlib:131: Fehler: »::rand« wurde nicht deklariert
/usr/include/c++/4.3/cstdlib:133: Fehler: »::srand« wurde nicht deklariertusing namespace std; #include <cstdlib> #define rand hide_this_function #define srand hide_this_function2 #undef rand #undef srand int rand(); void srand(int a=0, int b=0, int c=0);Das Hauptproblem ist also, rand und srand neu zu definieren. Ich stosse da aber an meine Grenzen, das einzige was mir noch einfaellt waere einen eigenen namespace anzulegen und in dem dann per using die einzelnen, im Programm verwendeten Funktionen usw. dem neuen Namespace bekannt zu machen.
-
ist es generell moeglich, in den system headern definierte Funktionen umzubenennen und dann selbst mit eigenem Inhalt zu definieren?
-
C167 schrieb:
ist es generell moeglich, in den system headern definierte Funktionen umzubenennen und dann selbst mit eigenem Inhalt zu definieren?
nein. ich hab es dir schon gesagt: was du machst macht keinen sinn.
sag einfach was du machen willst, dann koennen wir dir dabei helfen...
willst du eine eigene standard library implementieren? dann linke einfach nicht die bestehende.
-
nein, ich moechte ein c++ Programm umstellen, damit es die c++ header verwendet. durch die includes in den c++/4.3/c*-headern werden natuerlich die alten header verwendet, aber in den Namensraum gequetscht. Das Programm hat eigene Implementierungen von rand und srand, die (bei verwendung der alten c-header /stdlib.h)) vom praeprozessor umbenannt wurden.
Da die eigenen rand/srand-Funktionen relativ haeufig verwendet werden, waere der Aufwand, jede zu suchen und entweder einen Namensraum davor zu machen oder anders zu benennen ziemlich gross.
-
Ich bin mir nicht sicher ob ich dich richtig verstanden habe, aber die Situation sollte so aussehen, oder?
#include <cstdlib> // eigene zufalls-funktionen int rand() {...} void srand(int a = 0, int b = 0, int c = 0) {...} int main() { srand(); rand(); // ganz oft }Das sollte so doch problemlos laufen. Dafür gibt's ja namespaces. Problematisch wirds nur wenn da noch ein using namespace std steht. Dann kann der Compiler nämlich nicht mehr unterscheiden ob du die eigenen Funktionen aus dem globalen namespace meinst oder die aus dem std-namespace.
-
ist jetzt halt die Frage, ob ein "using namespace std" reinkommt oder ob mit einer Fuelle von using-Zeilen die einzelnen, benutzten Funktionen geholt werden...
-
Ich nehme mal an momentan wird einfach "using namespace std;" verwendet. Für die Zukunft würde ich vorschlagen ihr gewöhnt euch das ab und verwendet immer "std::". Als Quick'n'Dirty-Lösung könntet ihr eure rand/srand-Funktionen in einen eigenen namespace my_functions packen und dann per Find&Replace alle Aufrufe von rand/srand durch my_functions::rand/my_functions::srand ersetzen.
-
OhneName schrieb:
Für die Zukunft würde ich vorschlagen ihr gewöhnt euch das ab und verwendet immer "std::".
Bei _allen_ Funktionen aus der Standardbibliothek?? Macht das nicht den Quellcode durch die vielen std:: unuebersichtlicher? okay, man weiss immer, ob man jetzt ne Standardfunktion hat, aber Umstellen von mehreren hundert Aufrufen auf sowas geht einfach nicht.
OhneName schrieb:
Als Quick'n'Dirty-Lösung könntet ihr eure rand/srand-Funktionen in einen eigenen namespace my_functions packen und dann per Find&Replace alle Aufrufe von rand/srand durch my_functions::rand/my_functions::srand ersetzen.
Vielen Dank soweit, die ersten Dateien compilieren inzwischen, bis ich alle durch hab dauerts noch ne weile, erst dann kann ich testen, ob die Sache ueberhaupt noch laeuft.
Eh ichs vergesse, man kann doch die Sachen eines Namespaces einem anderen bekannt machen, oder?
namespace xyz { using std::cout; using std::endl; }War das so?
€dit: Hm... nun linkt er nicht mehr. Die Datei:
namespace pso { int rand(); void srand(int a=0, int b=0, int c=0); } using namepsace std; #include <cstdlib> ....Und das Ergebnis:
class-client.o: In function `client::getRandomServer()': class-client.cpp:(.text+0x1d08): undefined reference to `pso::rand()'€dit2: Oh tut das weh, natuerlich findet er sie nicht, wenn die Funktionen nicht entsprechend angelegt sind:
int pso::rand(...) {...}Somit gehts zumindest (momentan), danke dafuer. Nur bitte noch die obigen Fragen beantworten, falls moeglich
