<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[error: declaration of &#x27;int rand()&#x27; throws different exceptions]]></title><description><![CDATA[<p>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.<br />
Das Programm ueberlaedt die Funktionen rand und srand, Deklaration:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#undef rand
#undef srand
int rand();
void srand(int a=0, int b=0, int c=0);
...
using namespace std;
</code></pre>
<p>Wenn ich das jetzt compilieren moechte, erhalte ich folgende Fehlermeldung:</p>
<p>GCC 4.3 schrieb:</p>
<blockquote>
<p>random.cpp: In function 'int rand()':<br />
random.cpp:137: error: declaration of 'int rand()' throws different exceptions<br />
prots.h:17: error: from previous declaration 'int rand() throw ()'</p>
</blockquote>
<p>Damit bin ich nun ueberfordert. Hat jemand einen tipp?<br />
Es bringt auch nichts, wenn man &quot;using namespace std;&quot; vor die includierung und definition setzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Urspruenglich hatte die Datei _vor_ der includierung von cstdlib diese Definitionen:</p>
<pre><code class="language-cpp">#define rand hide_this_function
#define srand hide_this_function2
</code></pre>
<p>Die habe ich entfernt, damit er nicht schon vorher mit[quote=&quot;G++ 4.3]/usr/include/c++/4.3/cstdlib:131: error: '::rand' has not been declared<br />
/usr/include/c++/4.3/cstdlib:133: error: '::srand' has not been declared[/quote]abbricht.</p>
<p>System: Debian Sid<br />
Compiler: G++ 4.3</p>
<p>C167</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218176/error-declaration-of-int-rand-throws-different-exceptions</link><generator>RSS for Node</generator><lastBuildDate>Fri, 09 Oct 2026 06:29:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218176.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Jul 2008 05:05:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Thu, 17 Jul 2008 05:05:50 GMT]]></title><description><![CDATA[<p>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.<br />
Das Programm ueberlaedt die Funktionen rand und srand, Deklaration:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#undef rand
#undef srand
int rand();
void srand(int a=0, int b=0, int c=0);
...
using namespace std;
</code></pre>
<p>Wenn ich das jetzt compilieren moechte, erhalte ich folgende Fehlermeldung:</p>
<p>GCC 4.3 schrieb:</p>
<blockquote>
<p>random.cpp: In function 'int rand()':<br />
random.cpp:137: error: declaration of 'int rand()' throws different exceptions<br />
prots.h:17: error: from previous declaration 'int rand() throw ()'</p>
</blockquote>
<p>Damit bin ich nun ueberfordert. Hat jemand einen tipp?<br />
Es bringt auch nichts, wenn man &quot;using namespace std;&quot; vor die includierung und definition setzt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Urspruenglich hatte die Datei _vor_ der includierung von cstdlib diese Definitionen:</p>
<pre><code class="language-cpp">#define rand hide_this_function
#define srand hide_this_function2
</code></pre>
<p>Die habe ich entfernt, damit er nicht schon vorher mit[quote=&quot;G++ 4.3]/usr/include/c++/4.3/cstdlib:131: error: '::rand' has not been declared<br />
/usr/include/c++/4.3/cstdlib:133: error: '::srand' has not been declared[/quote]abbricht.</p>
<p>System: Debian Sid<br />
Compiler: G++ 4.3</p>
<p>C167</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548581</guid><dc:creator><![CDATA[C167]]></dc:creator><pubDate>Thu, 17 Jul 2008 05:05:50 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Thu, 17 Jul 2008 10:52:37 GMT]]></title><description><![CDATA[<p>C167 schrieb:</p>
<blockquote>
<p>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.<br />
Das Programm ueberlaedt die Funktionen rand und srand</p>
</blockquote>
<p>Was genau willst du machen?<br />
Das was du tust ist einfach nicht sinnvoll...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548745</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 17 Jul 2008 10:52:37 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Thu, 17 Jul 2008 11:22:44 GMT]]></title><description><![CDATA[<p>C167 schrieb:</p>
<blockquote>
<p>Das Programm ueberlaedt die Funktionen rand und srand, Deklaration:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#undef rand
#undef srand
int rand();
void srand(int a=0, int b=0, int c=0);
...
using namespace std;
</code></pre>
</blockquote>
<p>Das ist unzulässig (zumindest bzgl. rand). Auch mit &lt;cstdlib&gt; 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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548765</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 17 Jul 2008 11:22:44 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Thu, 17 Jul 2008 15:38:32 GMT]]></title><description><![CDATA[<p>ich hab die ganze sache inzwischen ein wenig aufgedroeselt:</p>
<pre><code class="language-cpp">#define rand hide_this_function
#define srand hide_this_function2

#include &lt;stdlib.h&gt;
#undef rand
#undef srand
int rand();
void srand(int a=0, int b=0, int c=0);

#endif
</code></pre>
<p>Was 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.</p>
<p>@Shade Of Mine: Ganz einfach: lernen<br />
Bezieht sich das &quot;nicht sinnvoll&quot; aufs ueberladen oder aufs umstellen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>ich hab versucht, das nun auch zu realisieren, zumindest sagt er jetzt nicht mehr</p>
<blockquote>
<p>/usr/include/c++/4.3/cstdlib:131: Fehler: »::rand« wurde nicht deklariert<br />
/usr/include/c++/4.3/cstdlib:133: Fehler: »::srand« wurde nicht deklariert</p>
</blockquote>
<pre><code class="language-cpp">using namespace std;
#include &lt;cstdlib&gt;
#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);
</code></pre>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1548930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1548930</guid><dc:creator><![CDATA[C167]]></dc:creator><pubDate>Thu, 17 Jul 2008 15:38:32 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Sun, 20 Jul 2008 01:03:42 GMT]]></title><description><![CDATA[<p>ist es generell moeglich, in den system headern definierte Funktionen umzubenennen und dann selbst mit eigenem Inhalt zu definieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550018</guid><dc:creator><![CDATA[C167]]></dc:creator><pubDate>Sun, 20 Jul 2008 01:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Sun, 20 Jul 2008 10:00:44 GMT]]></title><description><![CDATA[<p>C167 schrieb:</p>
<blockquote>
<p>ist es generell moeglich, in den system headern definierte Funktionen umzubenennen und dann selbst mit eigenem Inhalt zu definieren?</p>
</blockquote>
<p>nein. ich hab es dir schon gesagt: was du machst macht keinen sinn.</p>
<p>sag einfach was du machen willst, dann koennen wir dir dabei helfen...</p>
<p>willst du eine eigene standard library implementieren? dann linke einfach nicht die bestehende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550085</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 20 Jul 2008 10:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Sun, 20 Jul 2008 13:51:13 GMT]]></title><description><![CDATA[<p>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.<br />
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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550215</guid><dc:creator><![CDATA[C167]]></dc:creator><pubDate>Sun, 20 Jul 2008 13:51:13 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Sun, 20 Jul 2008 14:38:04 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht sicher ob ich dich richtig verstanden habe, aber die Situation sollte so aussehen, oder?</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;

// eigene zufalls-funktionen
int rand() {...}
void srand(int a = 0, int b = 0, int c = 0) {...}

int main()
{
  srand();
  rand(); // ganz oft
}
</code></pre>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550253</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Sun, 20 Jul 2008 14:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Sun, 20 Jul 2008 16:11:39 GMT]]></title><description><![CDATA[<p>ist jetzt halt die Frage, ob ein &quot;using namespace std&quot; reinkommt oder ob mit einer Fuelle von using-Zeilen die einzelnen, benutzten Funktionen geholt werden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550302</guid><dc:creator><![CDATA[C167]]></dc:creator><pubDate>Sun, 20 Jul 2008 16:11:39 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Sun, 20 Jul 2008 16:33:24 GMT]]></title><description><![CDATA[<p>Ich nehme mal an momentan wird einfach &quot;using namespace std;&quot; verwendet. Für die Zukunft würde ich vorschlagen ihr gewöhnt euch das ab und verwendet immer &quot;std::&quot;. Als Quick'n'Dirty-Lösung könntet ihr eure rand/srand-Funktionen in einen eigenen namespace my_functions packen und dann per Find&amp;Replace alle Aufrufe von rand/srand durch my_functions::rand/my_functions::srand ersetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550317</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Sun, 20 Jul 2008 16:33:24 GMT</pubDate></item><item><title><![CDATA[Reply to error: declaration of &#x27;int rand()&#x27; throws different exceptions on Sun, 20 Jul 2008 18:06:23 GMT]]></title><description><![CDATA[<p>OhneName schrieb:</p>
<blockquote>
<p>Für die Zukunft würde ich vorschlagen ihr gewöhnt euch das ab und verwendet immer &quot;std::&quot;.</p>
</blockquote>
<p>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.</p>
<p>OhneName schrieb:</p>
<blockquote>
<p>Als Quick'n'Dirty-Lösung könntet ihr eure rand/srand-Funktionen in einen eigenen namespace my_functions packen und dann per Find&amp;Replace alle Aufrufe von rand/srand durch my_functions::rand/my_functions::srand ersetzen.</p>
</blockquote>
<p>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.</p>
<p>Eh ichs vergesse, man kann doch die Sachen eines Namespaces einem anderen bekannt machen, oder?</p>
<pre><code>namespace xyz
{
    using std::cout;
    using std::endl;
}
</code></pre>
<p>War das so?</p>
<p>€dit: Hm... nun linkt er nicht mehr. Die Datei:</p>
<pre><code>namespace pso
{
   int rand();
   void srand(int a=0, int b=0, int c=0);
}
using namepsace std;
#include &lt;cstdlib&gt;
....
</code></pre>
<p>Und das Ergebnis:</p>
<pre><code>class-client.o: In function `client::getRandomServer()':                             
class-client.cpp:(.text+0x1d08): undefined reference to `pso::rand()'
</code></pre>
<p>€dit2: Oh tut das weh, natuerlich findet er sie nicht, wenn die Funktionen nicht entsprechend angelegt sind:</p>
<pre><code>int pso::rand(...) {...}
</code></pre>
<p>Somit gehts zumindest (momentan), danke dafuer. Nur bitte noch die obigen Fragen beantworten, falls moeglich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1550381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1550381</guid><dc:creator><![CDATA[C167]]></dc:creator><pubDate>Sun, 20 Jul 2008 18:06:23 GMT</pubDate></item></channel></rss>