<?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[Schnitstellen in C++?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich komme aus der Javawelt und muss leider ein paar Klassen nach C++ portieren. Gibt es hier was Vergleichbares wie Interfaces? Wie gut sind Exceptions in C++ umgesetzt?</p>
<p>Gruß Gilli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274573/schnitstellen-in-c</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 08:32:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274573.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 28 Sep 2010 17:09:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 17:09:24 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich komme aus der Javawelt und muss leider ein paar Klassen nach C++ portieren. Gibt es hier was Vergleichbares wie Interfaces? Wie gut sind Exceptions in C++ umgesetzt?</p>
<p>Gruß Gilli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958644</guid><dc:creator><![CDATA[Gilli82]]></dc:creator><pubDate>Tue, 28 Sep 2010 17:09:24 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 17:13:29 GMT]]></title><description><![CDATA[<p>In C++ werden Interfaces als Klassen mit nur pure virtual Functions umgesetzt.</p>
<p>Das sieht dann z.B. so aus:</p>
<pre><code class="language-cpp">class MyInterface
{
public:
   virtual void doThat() = 0;

protected:
   ~MyInterface() { }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1958646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958646</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 28 Sep 2010 17:13:29 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 17:35:01 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Eine kleine Korrektur: der Destruktor sollte virtual sein:</p>
<pre><code class="language-cpp">class MyInterface
{
public:
   virtual void doThat() = 0;

protected:
   virtual ~MyInterface() { }
};
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1958650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958650</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 28 Sep 2010 17:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 17:36:10 GMT]]></title><description><![CDATA[<p>Ups, das Zitat ist etwas verunglückt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958652</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 28 Sep 2010 17:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 18:27:21 GMT]]></title><description><![CDATA[<p>Gilli82 schrieb:</p>
<blockquote>
<p>ich komme aus der Javawelt und muss leider ein paar Klassen nach C++ portieren.</p>
</blockquote>
<p>Oha!<br />
Beachte, dass Du ein Java-Design nicht 1:1 nach C++ übertragen kannst. Das Ergebnis ist meist genauso schlecht wie eine Wort-für-Wort-Übersetzung einer Videorekorder-Anleitung von Chinesisch auf Englisch. (Kein Scherz!)</p>
<p>Gilli82 schrieb:</p>
<blockquote>
<p>Gibt es hier was Vergleichbares wie Interfaces?</p>
</blockquote>
<p>Es gibt abstrakte Klassen.</p>
<pre><code class="language-cpp">class abc
{
public:
  virtual ~abc() {} // &lt;-- brauchst Du, um Objekte &quot;polymorph löschen&quot; zu klönnen
  virtual void foo(int) = 0;       // &lt;-- abstrakt
  virtual int bar() const = 0;  // &lt;-- auch abstrakt
};
</code></pre>
<p>Gilli82 schrieb:</p>
<blockquote>
<p>Wie gut sind Exceptions in C++ umgesetzt?</p>
</blockquote>
<p>Du wirst erst mal das Stack-Trace-Feature vermissen. Wenn eine Ausnahme fliegt, die nicht gefangen wird, bricht das Programm sofort ab ohne einen Mucks -- es sei denn, Du hast einen entsprechenden Handler installiert. Desweiteren funktionieren &quot;exception specifications&quot; anders in C++. In Java werden die statisch überprüft, in C++ nicht -- daher sind sie eher nutzlos! Die beste Praxis ist es, keine Funktionen mit exception specifications zu dekorieren. Also:</p>
<pre><code class="language-cpp">void dingsbums() throw(std::runtime_error);
</code></pre>
<p>ist nix gut, wobei</p>
<pre><code class="language-cpp">/**
 * <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9880">@throw</a> std::runtime_error in case file xyz didn't exist.
 */
void dingsbums();
</code></pre>
<p>okay ist. Mach Dich mit der Dokumentation Deines Compilers und Deines Debuggers vertraut. Unter'm Debugger lässt sich vieles leichter nachvollziehen und den Aufruf-Stack gibt's da auch zu sehen. Dein(e) Compiler/Standardbibliothek bietet eventuell einen schönen &quot;STL-Debug-Modus&quot; an, welcher allerlei Zusatzüberprüfungen zwecks Fehlerfrüherkennung macht. Das kann <em>sehr</em> praktisch sein.</p>
<p>Mit hoher Wahrscheinlichkeit wird das, was Du in C++ schreibst erstmal totaler Müll sein. Das war bei mir auch so. <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="🙂"
    /> Lerne die Sprache <em>richtig</em>. Nachdem Du die Sprache kennengelernt hast, lese das Buch &quot;Effective C++&quot; von Scott Meyers -- wenn möglich in der 3. Auflage.</p>
<p>Nachtrag:<br />
Als Java-Programmierer wirst Du vielleicht erst mal dazu neigen, alles in Klassen mit vielen virtuellen Elementfunktionen zu verpacken. Das ist nicht immer sinnvoll. C++ bietet auch andere Abstraktionsmöglichkeiten.</p>
<p>Nachtrag2:<br />
Mir fällt noch das Konzept der getrennten Übersetzung ein. Das hatte ich auch anfangs nicht sofort verstanden. Lass Dir das und die &quot;one definition rule&quot; von den schlauen Büchern erklären.</p>
<p>Viel Spaß beim Lernen!</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958666</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 28 Sep 2010 18:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 18:21:27 GMT]]></title><description><![CDATA[<p>@manni66:</p>
<blockquote>
<p>Eine kleine Korrektur: der Destruktor sollte virtual sein:</p>
</blockquote>
<p>Nö.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Entweder <strong>public virtual</strong> ODER <strong>protected non- virtual</strong>...</p>
<p><strong>public virtual</strong> ist nur dann nötig wenn das Objekt, polymorph gelöscht werden soll (wie krümelkacker korrekt anmerkte).</p>
<p><strong>Edit:</strong><br />
Das gilt für Klassen die als Interface / Basis Klasse dienen. Nur um den Kontext klarzustellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958671</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 28 Sep 2010 18:21:27 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 18:26:35 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>@manni66:</p>
<blockquote>
<p>Eine kleine Korrektur: der Destruktor sollte virtual sein:</p>
</blockquote>
<p>Nö.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Entweder <strong>public virtual</strong> ODER <strong>protected non- virtual</strong>...</p>
<p><strong>public virtual</strong> ist nur dann nötig wenn das Objekt, polymorph gelöscht werden soll (wie krümelkacker korrekt anmerkte).</p>
<p><strong>Edit:</strong><br />
Das gilt für Klassen die als Interface / Basis Klasse dienen. Nur um den Kontext klarzustellen.</p>
</blockquote>
<p>Aus Kompatibilitätsgründen zu anderen Compilern, der Lesbarkeit und der Reduktion von Fehlerquellen sollte man sich das aber angewöhnen.</p>
<p>Oder sehe ich das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958676</guid><dc:creator><![CDATA[TheOtherOne]]></dc:creator><pubDate>Tue, 28 Sep 2010 18:26:35 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 18:52:59 GMT]]></title><description><![CDATA[<blockquote>
<p>Aus Kompatibilitätsgründen zu anderen Compilern, der Lesbarkeit und der Reduktion von Fehlerquellen sollte man sich das aber angewöhnen.</p>
</blockquote>
<p>Das musst Du mir jetzt aber genau erklären... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958693</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Tue, 28 Sep 2010 18:52:59 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Tue, 28 Sep 2010 19:05:24 GMT]]></title><description><![CDATA[<p>Dankeschön für die vielen Antworten, besonders Krümelkacker. Das scheint ja doch alles ein wenig komplexer zu sein als ich dachte und ich habe nicht die Zeit um mich ewig in eine neue Sprache einzuarbeiten, darum werde ich dann doch warten bis der C++ Kollege wieder da ist, der macht das seit 10 Jahren. Ich denke mal gutes C++ kann man nicht so schnell lernen wie Java.</p>
<p>Danke trotzdem für die Hilfe.</p>
<p>Gruß Gilli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958702</guid><dc:creator><![CDATA[Gilli82]]></dc:creator><pubDate>Tue, 28 Sep 2010 19:05:24 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 07:16:59 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Desweiteren funktionieren &quot;exception specifications&quot; anders in C++. In Java werden die statisch überprüft, in C++ nicht -- daher sind sie eher nutzlos! Die beste Praxis ist es, keine Funktionen mit exception specifications zu dekorieren.</p>
</blockquote>
<p>Eine Frage: Warum?</p>
<p>Ich arbeite hauptsächlich mit gcc, und dort ist es so, dass eine Exception nur &quot;weitergeworfen&quot; wird, wenn sie auch in der Spezifikation der Methode drinsteht (oder die Methode keine Spezifikation hat), ansonsten wird &quot;terminate()&quot; aufgerufen, und die Meldung ausgegeben welche Exception (mit what()-Ausgabe) zu dem Abbruch führt. Dank diesem Verhalten habe ich schon öfters fehlende &quot;catch&quot;-Blöcke finden können.</p>
<p>Also zurück zur Frage: Warum ist das nutzlos?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958811</guid><dc:creator><![CDATA[Yamakuzure]]></dc:creator><pubDate>Wed, 29 Sep 2010 07:16:59 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 07:47:43 GMT]]></title><description><![CDATA[<p>Herb Sutter im C++ Users Journal zu Exception Specifications:<br />
<a href="http://www.gotw.ca/publications/mill22.htm" rel="nofollow">http://www.gotw.ca/publications/mill22.htm</a></p>
<p>Herb Sutters GOTW Reihe:<br />
<a href="http://www.gotw.ca/gotw/082.htm" rel="nofollow">http://www.gotw.ca/gotw/082.htm</a></p>
<p>Simon</p>
<p><strong>Edit:</strong><br />
Und wenn ich schon dabei bin noch bezüglich <em>public virtual / protected non-virtual Destruktor</em>: <a href="http://www.gotw.ca/publications/mill18.htm" rel="nofollow">http://www.gotw.ca/publications/mill18.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958827</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 29 Sep 2010 07:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 07:56:51 GMT]]></title><description><![CDATA[<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Ich arbeite hauptsächlich mit gcc, und dort ist es so, dass eine Exception nur &quot;weitergeworfen&quot; wird, wenn sie auch in der Spezifikation der Methode drinsteht (oder die Methode keine Spezifikation hat), ansonsten wird &quot;terminate()&quot; aufgerufen, und die Meldung ausgegeben welche Exception (mit what()-Ausgabe) zu dem Abbruch führt. Dank diesem Verhalten habe ich schon öfters fehlende &quot;catch&quot;-Blöcke finden können.</p>
</blockquote>
<p>Jetzt, nachdem du die Antwort von theta gelesen hast und vielleicht eine Alternative finden möchtest, wie du die fehlenden Catch-Blöcke finden kannst, sei noch dies gesagt:<br />
1. Es gibt Programme, welche dies für dich prüfen können.<br />
2. Man kann auch in der <code>main</code> ein globales <code>try-catch</code> machen. Wenn man zudem sein Design entsprechend anpasst, kann man trotz auftreten eines Fehlers in der <code>main</code> , die Daten noch retten und sichern.<br />
Ich habe sogar schon gesehen, wie jemand das Programm in der <code>main</code> dann neugestartet hat mit den geretteten Daten. Also quasi: &quot;Fataler Fehler, Daten gerettet, Log Eintrag erstellt, sie dürfen weiterarbeiten!&quot; <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958835</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 29 Sep 2010 07:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 08:24:12 GMT]]></title><description><![CDATA[<p>Im Übrigen erklärt der kommende C++ Standard throw-Ausnahmespezifizierungen für &quot;deprecated&quot;! Sogar jedes <code>throw()</code> wird in der Standardbibliothek durch <code>noexcept</code> ersetzt.</p>
<p>Die Alternative wird dann so aussehen:</p>
<pre><code class="language-cpp">void f(int);                 // &lt;-- kann Ausnahme werfen
void g(int) noexcept;        // &lt;-- wirft keine Ausnahme
void h(int) noexcept(true);  // &lt;-- wirft keine Ausnahme
void k(int) noexcept(false); // &lt;-- kann Ausnahme werfen
</code></pre>
<p>...wobei die Doppelverneinung im letzten Fall etwas gewöhnungsbedürftig ist. <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>Darüberhinaus wird <code>noexcept</code> ein Compile-Zeit-Operator sein, mit dem man Ausdrücke darauf überprüfen kann, ob sie garantiert keine Ausnahme werfen können:</p>
<pre><code class="language-cpp">bool nx_f = noexcept( f(23) ); // false
bool nx_g = noexcept( g(42) ); // false oder true
bool nx_h = noexcept( h(17) ); // false oder true
bool nx_k = noexcept( k(29) ); // false
</code></pre>
<p>Mit anderen Worten: Der noexcept-Operator darf pessimistisch sein und immer false zurückgeben. Der Compilerhersteller sollte sich aber hier Mühe geben und die noexcept-Spezifikation beachten. Wenn der Operator true liefert, wirft der Ausdruck garantiert keine Ausnahme.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958843</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 29 Sep 2010 08:24:12 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 10:02:41 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>2. Man kann auch in der <code>main</code> ein globales <code>try-catch</code> machen.</p>
</blockquote>
<p>Und genau das führt dazu, dass freeorion auf meinem Rechner mit &quot;main() caught exception(std::exception): unregistered class&quot; nicht aussteigt, sondern endlos in der Event-Schleife weiterläuft. Mit dieser Meldung wird niemand jemals den Fehler finden ohne im geistigen &quot;Single-Step-Modus&quot; durchlatschen zu müssen.</p>
<p>Aber zurück zum Thema, ich kenne Sutter. Ich habe trotzdem mal den Inhalt hinter dem Link oben überflogen, und eine Sache ist Bemerkenswert:</p>
<p>Sutter schrieb:</p>
<blockquote>
<p>Here’s what many people think that exception specifications do:</p>
<ul>
<li>Guarantee that functions will only throw listed exceptions (possibly none).</li>
<li>Enable compiler optimizations based on the knowledge that only listed exceptions (possibly none) will be thrown.</li>
</ul>
</blockquote>
<p>Da habt Ihr natürlich Recht, wer von einer dieser beiden (oder von beiden) Annahmen ausgeht, liegt falsch und wird auf Probleme stoßen.<br />
(Siehe <em>Ralf Schneeweiß, Moderne C++-Programmierung</em>, Seite 162ff)<br />
Aber:</p>
<p>Sutter schrieb:</p>
<blockquote>
<p>The above expectations are, again, deceptively close to being correct. Consider again the code in Example 1(b):</p>
<pre><code class="language-cpp">// Example 1(b) reprise, and two
// potential white lies:
//
int Gunc() throw();    // will throw nothing (?)
int Hunc() throw(A,B); // can only throw A or B (?)
</code></pre>
<p>Are the comments correct? Not quite. Gunc() may indeed throw something, and Hunc() may well throw something other than A or B! The compiler just guarantees to beat them senseless if they do… oh, and to beat your program senseless too, most of the time.</p>
</blockquote>
<p>Und wenn ich, wie in meinem Post oben beschrieben, genau _dieses_ Verhalten haben möchte? Wenn ich erzwingen möchte das &quot;<em>hunc()</em>&quot; sich auch wirklich um alle Ausnahmen außer A und B selber kümmern _muss_? Dann kann ich mit der obigen Spezifikation dafür sorgen, dass entweder der Compiler und/oder das am ende stehende Programm mir <em>sinnvoll</em> (nicht sinnvoll siehe oben mit dem all-in-one-catch) um die Ohren fliegt.</p>
<p>Also zurück zur Frage: Warum ist das nutzlos?</p>
<p>Es erscheint mir eher, dass es wie bei vielen Details in C++ ist, es kommt auf das Wissen an, was geschieht.</p>
<p>Spätestens wenn man an einem Toolkit oder Framework arbeitet ist das schon wichtig, dass die Nutzer sich auf die per Ausnahmespezifikation getätigten Aussagen verlassen können. Auch ein Kommentar hilft da nicht weiter. Aber ein brutales terminate() im Testprogramm wird den Autoren des Übeltäters wohl eher zum Überarbeiten anregen, als eine nichtssagende, wer-weiß-woher stammende ::std::exception in einem Fehlerbericht. <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>
<p>Abhängigkeiten und externe Programme würde ein ToolKit-/FrameWork-/Bibliotheks-Programmierer ja sicher vermeiden wollen, gell? <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24868">@Krümelkacker</a>:<br />
Der kommende C++-Standard fühlt sich fast schon wie Perl6 oder Duke Nukem forever an. Diskutiert/gearbeitet wird daran seit gefühlten Äonen, aber zumindest im gcc-4.4.4, den ich nutze gilt nach wie vor:</p>
<pre><code class="language-cpp">#ifndef __GXX_EXPERIMENTAL_CXX0X__
# include &lt;c++0x_warning.h&gt;
</code></pre>
<p><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="😞"
    /> (Aber ich freue mich darauf wenn das ein Ende hat...)</p>
<p>Gerade im Hinblick auf das Exception-Handling, und der Verschiebung in die Kompilierzeit blicke ich dem sehr positiv entgegen. Denn eine solche Überprüfung ist natürlich um ein Vielfaches sinnvoller und gewinnbringender als ein terminate()-Abbruch eines laufenden Programms.</p>
<p>P.S.: Ich frage mich gerade, ob es sinnvoll ist das ToolKit, an dem ich gerade arbeite, schon heute nach C++0x zu &quot;portieren&quot; (&quot;aufbohren&quot; triffts wohl eher)... Was meint Ihr? Immerhin müsste dann jeder Nutzer mit &quot;-std=c++0x&quot; kompilieren.</p>
<p><em>Edith hat anzumerken</em>: Erst im März 2011 soll C++0x Draft abgeschlossen sein, und WG21 (<a href="http://www.open-std.org/jtc1/sc22/wg21/" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/</a>) geht laut wikipedia davon aus, dass es bis zum ISO Standard nochmal sechs bis 12 Monate dauert. Ich glaube C++0x ist (noch) keine Option.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958870</guid><dc:creator><![CDATA[Yamakuzure]]></dc:creator><pubDate>Wed, 29 Sep 2010 10:02:41 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 10:01:35 GMT]]></title><description><![CDATA[<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>2. Man kann auch in der <code>main</code> ein globales <code>try-catch</code> machen.</p>
</blockquote>
<p>Und genau das führt dazu, dass freeorion auf meinem Rechner mit &quot;main() caught exception(std::exception): unregistered class&quot; nicht aussteigt, sondern endlos in der Event-Schleife weiterläuft. Mit dieser Meldung wird niemand jemals den Fehler finden ohne im geistigen &quot;Single-Step-Modus&quot; durchlatschen zu müssen.</p>
</blockquote>
<p>Tja, auch beim Werfen von Exceptions gilt es sinnvolle Informationen mitzuliefern. Oh Wunder, man könnte sogar Zeilennummer und File-Namen mitwerfen. Siehe die Makros <code>__FILE__</code> und <code>__LINE__</code> .</p>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Und wenn ich, wie in meinem Post oben beschrieben, genau _dieses_ Verhalten haben möchte? Wenn ich erzwingen möchte das &quot;<em>hunc()</em>&quot; sich auch wirklich um alle Ausnahmen außer A und B selber kümmern _muss_? Dann kann ich mit der obigen Spezifikation dafür sorgen, dass entweder der Compiler und/oder das am ende stehende Programm mir <em>sinnvoll</em> (nicht sinnvoll siehe oben mit dem all-in-one-catch) um die Ohren fliegt.</p>
</blockquote>
<p>Du willst ein Verhalten, welches nicht mal garantiert ist? Siehe den letzten Teil:</p>
<blockquote>
<p>The compiler just guarantees to beat them senseless if they do… oh, and to beat your program senseless too, <strong>most of the time.</strong></p>
</blockquote>
<p>Zum Beispiel ignoriert der MSVC die Dinger rigoros <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="😉"
    /><br />
Zudem ist auch keine Garantie vorhanden, welche Informationen du von einem <code>terminate</code> erhälst. Das kann grundsätzlich auch einfach so lauten: &quot;The program terminated.&quot; Eine Menge an Informationen, muss ich schon sagen <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>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Der kommende C++-Standard fühlt sich fast schon wie Perl6 oder Duke Nukem forever an. Diskutiert/gearbeitet wird daran seit gefühlten Äonen, ...</p>
</blockquote>
<p>Leicht übertrieben. Der letzte Standard war von 2003. Im 2006 kam der TR1 heraus. Und wie es aktuell aussieht, wird Ende 2011 der neue C++ Standard von der ISO veröffentlicht werden.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958878</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 29 Sep 2010 10:01:35 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 10:49:21 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Dravere schrieb:</p>
<blockquote>
<p>2. Man kann auch in der <code>main</code> ein globales <code>try-catch</code> machen.</p>
</blockquote>
<p>Und genau das führt dazu, dass freeorion auf meinem Rechner mit &quot;main() caught exception(std::exception): unregistered class&quot; nicht aussteigt, sondern endlos in der Event-Schleife weiterläuft. Mit dieser Meldung wird niemand jemals den Fehler finden ohne im geistigen &quot;Single-Step-Modus&quot; durchlatschen zu müssen.</p>
</blockquote>
<p>Tja, auch beim Werfen von Exceptions gilt es sinnvolle Informationen mitzuliefern. Oh Wunder, man könnte sogar Zeilennummer und File-Namen mitwerfen. Siehe die Makros <code>__FILE__</code> und <code>__LINE__</code> .</p>
</blockquote>
<p>Okay, Missverständnis: Ich habe mit der Entwicklung von freeorion nichts zu tun. Und meine Exceptions halten sich an das Muster, dass in der PDFLib verwendet wird, also nicht nur &quot;was&quot;, sondern auch &quot;woher&quot;. Wäre der Kram auf meinem Mist gewachsen, würde die Ausgabe ungefähr so lauten:<br />
&quot;<em>main() caught exception(pwx::mrf::ExceptionBase): [TMemRing-&gt;isValueIn()] Data not found</em>&quot; ... Genau das hatte ich gestern Abend, und die Methode isValueIn() hat nur fünf Zeilen, von denen nur eine werfen kann, und die war auch Schuld.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Du willst ein Verhalten, welches nicht mal garantiert ist?</p>
</blockquote>
<p>Nein, ich möchte mich selbst zwingen nur das auszuliefern, was tut wie geheißen. Wenn ich eine Methode mit &quot;throw()&quot; angebe, dann darf diese auch wirklich nichts werfen. Mache ich bei der Umsetzung etwas falsch, soll es knallen, und nicht Unsinn über ein main-catch ausgegeben werden. (Und da ich mit gcc schreibe und teste kann mir das verhalten des MSVC egal sein. Zum Glück. ;))</p>
<p>Draveres schrieb:</p>
<blockquote>
<p>Zudem ist auch keine Garantie vorhanden, welche Informationen du von einem <code>terminate</code> erhälst. Das kann grundsätzlich auch einfach so lauten: &quot;The program terminated.&quot; Eine Menge an Informationen, muss ich schon sagen <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>
</blockquote>
<p>Auf meinem System, das für die Entwicklung zählt, ist es zum Glück anders, sonst würde ich es nicht so machen.</p>
<p>Draveres schrieb:</p>
<blockquote>
<p>Leicht übertrieben. Der letzte Standard war von 2003. Im 2006 kam der TR1 heraus. Und wie es aktuell aussieht, wird Ende 2011 der neue C++ Standard von der ISO veröffentlicht werden.</p>
</blockquote>
<p>Oder Anfang 2012, wie ich schrieb, fals du meinen Edit noch gesehen hast. Ich habe hier auch nicht nur absichtlich, sondern sehr rigoros übertrieben, und nicht nur leicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Wie dem auch sei, das Gefrickel mit den Ausnahmespezifizierern tue ich mir auch wirklich nur aus den oben genannten Gründen an. Es gibt nämlich noch einen Nachteil: Die Funktionsliste von Code::Blocks findet keine Funktion, die einen Ausnahmespezifikation hat. Sehr nervig!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958891</guid><dc:creator><![CDATA[Yamakuzure]]></dc:creator><pubDate>Wed, 29 Sep 2010 10:49:21 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 11:07:38 GMT]]></title><description><![CDATA[<p>Wieso ist es besser, wenn es über <code>terminate</code> knallt oder in der main-Funktion tut? Du kannst ja, wenn du unbedingt willst, während der Entwicklung im Catch-Block in der <code>main</code> selber ein <code>terminate</code> aufrufen. Oder wie ich es für sehr viel sinnvoller halte, während der Entwicklung im Debug-Modus laufen lassen und den Code anhalten lassen, wenn eine unbehandelte Ausnahme auftritt. Dann siehst du auch schön den Callstack und je nach Debugger sogar die Werte.</p>
<p>Und es ist sehr schön, wenn es auf deinem System so läuft. Je nach Verwendung und Grösse deines Projektes, wird es aber nicht bei deinem System bleiben. Ein Code kann auch mal auf einen anderen Kompiler portiert werden. Wenn du OpenSource entwickelst, dann sowieso.</p>
<p>Es gibt so viele Nachteile bei der Ausnahmespezifikation (du listest sogar zusätzlich auf!) und gäbe so viele bessere Methoden, das gleiche zu erreichen, was du über die Ausnahmespezifikation erreichst, ohne all diese Nachteile ... wieso machst du es dann immernoch über die Ausnahmespezifikation? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958901</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 29 Sep 2010 11:07:38 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 12:57:40 GMT]]></title><description><![CDATA[<p>Irgendwie ist es schwierig das zu beschreiben.</p>
<p>Also ich versuche das mal anhand eines Falles, den ich vorgestern hatte, wo die Spezifikation mit terminate() ein Glücksfall war:<br />
Eine Methode setzt einen internen Zeiger auf ein Element einer doppelt verketten Liste, und tut dieses je nach Index, der übergeben wird. Die übergebene Zahl wird vorher normalisiert, so dass sie auf jeden Fall &quot;<em>0 &lt;= index &lt; size()</em>&quot; ist.<br />
Die benannte Methode schlägt niemals fehl, es sei denn, es gibt keine Elemente. In diesem Fall wirft sie eine spezielle Ausnahme, die nur von dieser einen Methode geworfen werden kann.<br />
Ich habe eine andere Methode mit throw() markiert. Diese sollte überprüfen, ob es in der Liste ein per Argument übergebenes Element gibt. (Ein kleiner Vorgriff: Ich hatte in genau dieser Methode vergessen den Fall, dass die Liste leer ist, abzufangen. Da dieser Fall aber abgefangen hätte werden müssen, hatte ich auf einen try-catch-Block verzichtet.) Diese Methode geht nun die Liste durch, und muss dafür jedes Element bis zum Ende, oder bis zu einem Treffer überprüfen. Hierfür wird die oben beschriebene Methode in einer Schleife verwendet.</p>
<p>Mit der Technik des globalen try-catch-Blocks (den ich übrigens auch verwende) hätte ich nur die Aussage erhalten, das eine Ausnahme vom Typ der abgefangen Klasse (Im Zweifelsfall std::exception) aufgetreten ist. Der Nutzen wäre gleich null gewesen. Diese Ausnahme kommt immer aus der gleichen Methode, keine sonstwie übergebenen Informationen hätte irgendeine Hilfe sein können.</p>
<p>Mit der terminate()-Methode hatte ich dagegen genau zwei Aussagen:</p>
<p>1.: Es handelt sich um genau diese spezielle Ausnahme, von wo die geworfen wird, war mir als Entwickler natürlich aufgrund ihrer Natur klar.<br />
2.: Die Ausnahme trat an einer Stelle auf, wo sie nicht auftreten durfte.</p>
<p>Nun handelt es sich bei dem Programm um ein Testprogramm für eben dieses zu entwickelnde Toolkit. Und wie das bei Testprogrammen so üblich ist (sein sollte), hat es natürlich vor dem Abbruch genau angemerkt, was geschehen soll.<br />
So war es für mich ein Leichtes den Fehler zu finden, denn der einzige &quot;Übeltäter&quot; konnte die mit throw() markierte Methode sein, die es natürlich auch war.<br />
Am Ende wird es nicht mehr zu einem terminate() kommen können. Zum Einen weil das Testprogramm mir ermöglichen soll alle &quot;Störstellen&quot; zu finden, zum Anderen weil die Ausnahmespezifikationen am Ende wieder entfernt werden.</p>
<p>--- cut ---<br />
Es handelt sich hierbei, _natürlich_, um einen Sonderfall. Ich versuche auch nicht irgendwem weißzumachen, das Ausnahmespezifikation was ganz Tolles wären. Sind sie nicht. Bei einer normalen Applikation würde ich sie eher vermeiden wollen, da sie die Flexibilität einschränken.<br />
Es geht mir nur darum, dass es gerade bei einer so vielfältigen Sprache wie C++ eher ungünstig ist, solche Pauschalaussagen wie &quot;Ist nutzlos&quot; zu tätigen. Vor allem wenn ich den Gegenbeweis &quot;Bunt auf weiß&quot; in meiner IDE vor Augen habe. <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="😉"
    /><br />
Zusätzlich habe ich mit dem FreeOrion-Beispiel auch noch den Gegenbeweis zu &quot;du brauchst nur catch in main()&quot;, diesmal &quot;weiß auf schwarz&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958989</guid><dc:creator><![CDATA[Yamakuzure]]></dc:creator><pubDate>Wed, 29 Sep 2010 12:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 13:21:47 GMT]]></title><description><![CDATA[<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Mit der Technik des globalen try-catch-Blocks (den ich übrigens auch verwende) hätte ich nur die Aussage erhalten, das eine Ausnahme vom Typ der abgefangen Klasse (Im Zweifelsfall std::exception) aufgetreten ist. Der Nutzen wäre gleich null gewesen. Diese Ausnahme kommt immer aus der gleichen Methode, keine sonstwie übergebenen Informationen hätte irgendeine Hilfe sein können.</p>
</blockquote>
<p>1. Wenn du nützliche Informationen in der Exception verpacken würdest, hätte es durchaus einen Mehrwert gehabt. Man muss ja nicht nur ein <code>catch(...)</code> durchführen in der main. Man kann ja auch die zahllosen verschiedenen Basis-Exception abfangen, welche man verwendet oder sogar ganz anderes zeug. Wenn also sinnvolle Informationen in der Exception vorhanden wären, hättest du auch die nötigen Informationen in der main gehabt.<br />
2. Ein Debugger hätte dir diese Informationen sofort geliefert und gerade dazu sind Debugger auch da.</p>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Es geht mir nur darum, dass es gerade bei einer so vielfältigen Sprache wie C++ eher ungünstig ist, solche Pauschalaussagen wie &quot;Ist nutzlos&quot; zu tätigen. Vor allem wenn ich den Gegenbeweis &quot;Bunt auf weiß&quot; in meiner IDE vor Augen habe.</p>
</blockquote>
<p>Ausnahmespezifikationen sind in der aktuellen Form ziemlich nutzlos. Nicht ohne Grund nimmt man sie aus dem Standard raus. Ich kann mich nur wiederholen, es gibt deutlich besser Alternativen, für das was du erreichen möchtest.</p>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Zusätzlich habe ich mit dem FreeOrion-Beispiel auch noch den Gegenbeweis zu &quot;du brauchst nur catch in main()&quot;, diesmal &quot;weiß auf schwarz&quot;.</p>
</blockquote>
<p>Das ist doch kein Gegenbeweis. Das ist nur ein Beweis, dass ihre Fehlermeldungen schlecht sind und allenfalls die mitgelieferten Fehlerinformationen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959009</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 29 Sep 2010 13:21:47 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 15:35:32 GMT]]></title><description><![CDATA[<p>Zu 1.:<br />
Du liest den Text nicht. _Meine_ exceptions tragen die Informationen was _wo_ passiert ist mit.(*) In dem Beispiel hätte diese Information aber nur ausgesagt, was ich eh schon wusste, da genau diese Exception an nur einer einzigen Stelle vorkommt. Aber die Methode, die diese Ausnahme nicht abgefangen hat, was ein Fehler war, hätte sie unbedingt abfangen _müssen_, da diese spezielle Methode _niemals_ fehlschlagen darf. Ich musste aber nicht herausfinden _das_ eine Ausnahme aufgetreten ist, sondern _wo_ sie _nicht_ aufgefangen wurde.</p>
<p>Und in main() steht:</p>
<pre><code class="language-cpp">try
  {
    /* alle möglichen tests */
  }
catch (pwx::mrf::ExceptionBase &amp;e) { /* info handling */ }
catch (std::exception &amp;e) { /* sonstige exception infos */ }
catch (...) { /* Panik! */ }
</code></pre>
<p>(*) Gespeichert wird: Objektname, Methodenname, Datei, Zeile, Beschreibung, relevante Daten. Aber das reicht nun einmal nicht immer.</p>
<p>Zu 2.: Ja, ich weiß. Ich verwende gdb sehr intensiv, da er sehr gut in Code::Blocks integriert ist.</p>
<p>Zum &quot;Gegenbeweis&quot;: Es ist der Beweis dafür, dass die Pauschalaussage, das try-catch in main() alle Probleme pauschal löst, falsch ist. Man muss schon ein wenig mehr tun, wie du selber ja sagst, gell? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1959093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959093</guid><dc:creator><![CDATA[Yamakuzure]]></dc:creator><pubDate>Wed, 29 Sep 2010 15:35:32 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Fri, 01 Oct 2010 06:06:19 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Herb Sutter im C++ Users Journal zu Exception Specifications:<br />
<a href="http://www.gotw.ca/publications/mill22.htm" rel="nofollow">http://www.gotw.ca/publications/mill22.htm</a></p>
</blockquote>
<p>Auch wenn ich Herb Sutters Ausführungen zu C++ als sehr hochwertig betrachte, ist dies in Bezug auf Exceptions definitiv nicht der Fall. Es gibt in C++ keinerlei logischen Grund einen Destruktor nicht als throw() zu definieren, da Exception werfende Destruktoren unweigerlich zu Problemen führen, und früher oder später eine zweite Exception geworfen wird -&gt; terminate(). Da aber in Falle eines werfenden Destruktors das ganze nicht mehr deterministisch passiert, ist der Fehler faktisch schwer zu finden. Daher sollten Destruktoren <strong>immer</strong> throw() definiert sein.</p>
<p>Es kann doch nicht sein, daß man eine Programmsprache nach den mangelhaften Compiler entwirft. Wenn der Compiler kaputt ist, sollte man ihn reparieren und nicht die Sprache an den kaputten Compiler anpassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959095</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Fri, 01 Oct 2010 06:06:19 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 15:45:48 GMT]]></title><description><![CDATA[<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Du liest den Text nicht.</p>
</blockquote>
<p>Doch, tue ich. Ich möchte dich also bitten, wenn ich mir schon die Zeit nehme, deine Beiträge durchzulesen, dass du mir nicht unterstellst, dass ich dies nicht tue. Ich habe einfach deinen Text missverstanden. Wahrscheinlich weil er etwas komplex ist, um einen simplen Sachverhalt zu erklären.</p>
<p>Man hätte nämlich sagen können, dass bei einem globalen <code>try-catch</code> in der <code>main</code> , der Callstack fehlt. Das ist grundsätzlich schon alles, was du kritisierst. Aber wie gesagt, dazu gäbe es ja den Debugger.</p>
<p>Aber den benutzt du ja anscheinend auch:</p>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Zu 2.: Ja, ich weiß. Ich verwende gdb sehr intensiv, da er sehr gut in Code::Blocks integriert ist.</p>
</blockquote>
<p>Dann frage ich mich immer noch, wieso du die <code>throw</code> -Spezifikation verwendest. Mit dem Debugger hättest du diese Informationen schliesslich auch problemlos erhalten.</p>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Zum &quot;Gegenbeweis&quot;: Es ist der Beweis dafür, dass die Pauschalaussage, das try-catch in main() alle Probleme pauschal löst, falsch ist. Man muss schon ein wenig mehr tun, wie du selber ja sagst, gell? <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>
</blockquote>
<p>Ich habe dies so nicht gesagt. Nicht mal annähernd. Ich wollte eine Alternative Vorschlagen, welche in vielen Fällen sehr praktisch sein kann. Als eine pauschale Lösung für alle Probleme, habe ich dies nie beworben.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959103</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959103</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 29 Sep 2010 15:45:48 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 16:04:17 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>Auch wenn ich Herb Sutters Ausführungen zu C++ als sehr hochwertig betrachte, ist dies in Bezug auf Exceptions definitiv nicht der Fall. Es gibt in C++ keinerlei logischen einen Destruktor nicht als throw() zu definieren, da Exception werfende Destruktoren unweigerlich zu Problemen führen, und früher oder später eine zweite Exception geworfen wird -&gt; terminate(). Da aber in Falle eines werfenden Destruktors das ganze nicht mehr deterministisch passiert, ist der Fehler faktisch schwer zu finden. Daher sollten Destruktoren <strong>immer</strong> throw() definiert sein.</p>
</blockquote>
<p>1. Du solltest lesen, was Herb Sutter da geschrieben hat. Ich zitiere es gerne mal:</p>
<blockquote>
<p>Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.</p>
<p>Boost’s experience is that a throws-nothing specification on a non-inline function is the only place where an exception specification “may have some benefit with some compilers” [emphasis mine]. That’s a rather underwhelming statement in its own right, but a useful consideration if you have to write portable code that will be used on more than one compiler platform.</p>
<p>It’s actually even a bit worse than that in practice, because it turns out that popular implementations vary in how they actually handle exception specifications. At least one popular C++ compiler (Microsoft’s, up to version 7.x) parses exception specifications but does not actually enforce them, reducing the exception specifications to glorified comments. But, on the other hand, there are legal optimizations a compiler can perform outside a function, and which the Microsoft 7.x compiler does perform, that rely on the ES enforcement being done inside each function -- the idea is that if the function did try to throw something it shouldn’t the internal handler would stop the program and control would never return to the caller, so since control did return to the caller the calling code can assume nothing was thrown and do things like eliminate external try/catch blocks. So on that compiler, because the checking is not done but the legal optimization that relies on it is done, the meaning of “throw()” changes from the standard “check me on this, stop me if I inadvertently throw” to a “trust me on this, assume I’ll never throw and optimize away.” So beware: If you do choose to use even an empty throw-specification, read your compiler’s documentation and check to see what it will really do with it. You might just be surprised. Be aware, drive with care.</p>
</blockquote>
<p>Er schliesst gerade <code>throw()</code> nicht vollständig aus. Mahnt aber zur Vorsicht.</p>
<p>2. Ein Destruktor von einem Stackobjekt oder einem Objekt mit statischer Lebensdauer, welcher eine Exception wirft, löst automatisch ein <code>terminate</code> aus.</p>
<p>3. Ich würde aber anstatt <code>throw()</code> zu nehmen, doch lieber folgendes machen, falls die Unsicherheit wirklich besteht.</p>
<pre><code class="language-cpp">try
{
  // ...
}
catch(...)
{
  std::terminate();
}
</code></pre>
<p>Ich konnte sowas aber bisher By-Design ausschliessen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959110</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 29 Sep 2010 16:04:17 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 16:14:12 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Du liest den Text nicht.</p>
</blockquote>
<p>Doch, tue ich. Ich möchte dich also bitten, wenn ich mir schon die Zeit nehme, deine Beiträge durchzulesen, dass du mir nicht unterstellst, dass ich dies nicht tue. Ich habe einfach deinen Text missverstanden. Wahrscheinlich weil er etwas komplex ist, um einen simplen Sachverhalt zu erklären.</p>
</blockquote>
<p>Entschuldige bitte. Ich bin frustriert, weil ich mich irgendwie nicht verständlich machen kann. Außerdem bekomme ich langsam Kopfschmerzen. (Was aber an der Arbeit liegt, nicht am Forum)</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Dann frage ich mich immer noch, wieso du die <code>throw</code> -Spezifikation verwendest. Mit dem Debugger hättest du diese Informationen schliesslich auch problemlos erhalten.</p>
</blockquote>
<p>Ich benutze den Debugger bei Bedarf, und in diesem Fall habe ich ihn nicht gebraucht, da in diesem <em>sehr speziellen</em> Fall die <code>terminate()</code> -Ausgabe bereits sofort gezeigt hat, was schief war. Die Spezifikationen werden ab einem bestimmten Stand des Projekts auch wieder entfernt, und normalerweise benutze ich sie garnicht.</p>
<p>Ich habe übrigens nie behauptet, dass du main-&gt;try-&gt;catch als ultimative lösung beworben hättest, ich habe nur gesagt, dass es keine allgemeingültige Lösung ist, und das du mir darin bereits zugestimmt hast. <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>@~john:<br />
Ja. Der Destruktor darf niemals eine Ausnahme werfen, schließlich könnte der Destruktor gerade in Folge einer Ausnahme im Rahmen des Stackunwindings aufgerufen werden. Würde er nun eine Ausnahme werfen, gäbe es keine Möglichkeit mehr darauf zu reagieren. Tatsächlich würde sofort <code>terminate()</code> aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959113</guid><dc:creator><![CDATA[Yamakuzure]]></dc:creator><pubDate>Wed, 29 Sep 2010 16:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 16:37:48 GMT]]></title><description><![CDATA[<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Ich benutze den Debugger bei Bedarf, und in diesem Fall habe ich ihn nicht gebraucht, da in diesem <em>sehr speziellen</em> Fall die <code>terminate()</code> -Ausgabe bereits sofort gezeigt hat, was schief war. Die Spezifikationen werden ab einem bestimmten Stand des Projekts auch wieder entfernt, und normalerweise benutze ich sie garnicht.</p>
</blockquote>
<p>Du entfernst die Spezifikation später sogar? Das ist doch ein riesiger Aufwand. Wieso startest du das Programm nicht immer mit dem Debugger? Während mein Programm in der Entwicklungsphase ist, starte ich es immer mit einem Debugger. Es ist eher die Ausnahme, wenn ich es ohne Debugger starte.</p>
<p>Yamakuzure schrieb:</p>
<blockquote>
<p>Ich habe übrigens nie behauptet, dass du main-&gt;try-&gt;catch als ultimative lösung beworben hättest, ich habe nur gesagt, dass es keine allgemeingültige Lösung ist, und das du mir darin bereits zugestimmt hast.</p>
</blockquote>
<p>Also moment:<br />
1. Du hast gesagt, dass ein globales <code>try-catch</code> bei der <code>main</code> zum Verhalten von FreeOrion führt. Ich habe bereits gesagt, dass dies nicht das Problem des globalen <code>try-catch</code> ist, sondern dass die Entwickler hinter FreeOrion womöglich Fehler in ihrem Exception Design haben.<br />
2. Später hast du meine Aussage zu einem &quot;du brauchst nur catch in main&quot; irgendwie umformuliert. Das habe ich aber so nie gesagt, nicht in diesem Kontext und wurde auch in diesem Thread nie so erwähnt. Da nur ich allerdings etwas von <code>catch</code> in der <code>main</code> gesagt habe, habe ich dies darauf zurückgeführt, dass du meinst, ich hätte dies so gemeint.<br />
3. Du hast dann gesagt: &quot;Es ist der Beweis dafür, dass die Pauschalaussage, das try-catch in main() alle Probleme pauschal löst, falsch ist.&quot;. Welche Pauschalaussage nun, wenn du behauptest, dass du nie behauptet hättest, dass ich main-try-catch als Pauschallösung für alle Probleme beworben hätte.</p>
<p>... uh, der letzte Satz gibt einem wirklich Kopfweh <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959125</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 29 Sep 2010 16:37:48 GMT</pubDate></item><item><title><![CDATA[Reply to Schnitstellen in C++? on Wed, 29 Sep 2010 17:10:37 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>1. Du solltest lesen, was Herb Sutter da geschrieben hat. Ich zitiere es gerne mal:</p>
</blockquote>
<p>Stell Dir mal vor, das habe ich nicht zum erstenmal gelesen, und jedesmal aufs neue stelle ich fest, daß das ein ziemlicher Kappes ist. Denn es werden in erster Linie Argumente wegen kaputter Compiler oder suboptimaler Implementierung angeführt, und das kann beim besten Willen kein Argument sein die Sprache abzuändern.</p>
<p>Denn man kann sehr wohl einen Compiler schreiben, der erkennt, daß in einer Funktion keinerlei Code von Nöten ist, wenn in ihm ausschließlich throw() Funktionen benutzt werden. Insofern wäre dies ein Aufruf gewesen, die Compiler zu verbessern. Man will in Bezug auf throw() dieses Verhalten nun über ein anderes Sprachkonstrukt erreichen. Aber das ist schlecht. Es verkompliziert die Sprache weiter und macht alten Code kaputt (früher oder später), ohne dafür irgend einen triftigen Grund (bezüglich des Sprachdesigns) zu liefern. Schlußendlich macht man das nur, weil Compilerhersteller nicht willens sind ihre Compiler zu verbessern.</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>3. Ich würde aber anstatt <code>throw()</code> zu nehmen, doch lieber folgendes machen, falls die Unsicherheit wirklich besteht.</p>
</blockquote>
<p>Damit wird eben gerade <strong>nicht</strong> dokumentiert, daß diese Klasse bei Destruktion keine Exception wirft. Die Eigenschaft &quot;wirft nicht bei Destruktion&quot; ist fundamental und Eigenschaft des Interfaces. Wenn es eine Verletzung des Interfaces gibt, dann hat es keinen Sinn das Programm weiterlaufen zu lassen, da schon längst der Zustand &quot;undefined behavior&quot; erreicht ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1959137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1959137</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Wed, 29 Sep 2010 17:10:37 GMT</pubDate></item></channel></rss>