<?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[Warnungsfreien code schreiben....]]></title><description><![CDATA[<p>Hi,</p>
<p>Also wahrnungsfreien code zu schreiben und das auf höchster Warnstufe ist ja mit Sicherheit sinnvoll um sich vom Compiler so weit wie irgendmöglich unterstützen zu lassen. Allerdings machts mir mein VS2003 Compiler teilweise nicht leicht. Hier mal ein paar Beispiele:</p>
<pre><code class="language-cpp">// Problem
do
{
  //...
} while (TRUE);

// beschwert sich über den konstanten Ausdruck als Bedingung

// Alternative
BOOL bEndless = TRUE;
do
{

} while (bEndless);

// auch nicht wirklich hübsch
</code></pre>
<pre><code class="language-cpp">// Problem
char c = 0xE8;

// beschwert sich über verkürzten konstanten Ausdruck??? Ich hätte eigentlich lieber gern eine genaue kopie des Bytes ohne verkürzung nur wie?
</code></pre>
<pre><code class="language-cpp">// Problem
InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  return NOT_SUPPORTED;
}

// beschwert sich das ich die Parameter nicht verwende. Aber wozu denn auch, die se implementation dient ja nur als abfangmechanismus für nicht implementierte Funktionen.

InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  param1 = param1;
  param2 = param2;
  param3 = param3;

  return NOT_SUPPORTED;
}

// man oh man. ziemlicher mist und auch nicht ganz ungefährlich
</code></pre>
<p>Soviel zu meinen ersten erlebnissen, nur was mache ich Falsch und wie macht mans Besser?</p>
<p>Vielen dank im voraus<br />
template</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/127123/warnungsfreien-code-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 00:12:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/127123.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Nov 2005 15:48:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 15:48:53 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Also wahrnungsfreien code zu schreiben und das auf höchster Warnstufe ist ja mit Sicherheit sinnvoll um sich vom Compiler so weit wie irgendmöglich unterstützen zu lassen. Allerdings machts mir mein VS2003 Compiler teilweise nicht leicht. Hier mal ein paar Beispiele:</p>
<pre><code class="language-cpp">// Problem
do
{
  //...
} while (TRUE);

// beschwert sich über den konstanten Ausdruck als Bedingung

// Alternative
BOOL bEndless = TRUE;
do
{

} while (bEndless);

// auch nicht wirklich hübsch
</code></pre>
<pre><code class="language-cpp">// Problem
char c = 0xE8;

// beschwert sich über verkürzten konstanten Ausdruck??? Ich hätte eigentlich lieber gern eine genaue kopie des Bytes ohne verkürzung nur wie?
</code></pre>
<pre><code class="language-cpp">// Problem
InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  return NOT_SUPPORTED;
}

// beschwert sich das ich die Parameter nicht verwende. Aber wozu denn auch, die se implementation dient ja nur als abfangmechanismus für nicht implementierte Funktionen.

InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  param1 = param1;
  param2 = param2;
  param3 = param3;

  return NOT_SUPPORTED;
}

// man oh man. ziemlicher mist und auch nicht ganz ungefährlich
</code></pre>
<p>Soviel zu meinen ersten erlebnissen, nur was mache ich Falsch und wie macht mans Besser?</p>
<p>Vielen dank im voraus<br />
template</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923449</guid><dc:creator><![CDATA[template]]></dc:creator><pubDate>Mon, 21 Nov 2005 15:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 15:52:54 GMT]]></title><description><![CDATA[<p>Denke damit musst du leben, wenn du auf höchste Warnstufe stellt.</p>
<p>Er warnt hier überall, wo sich potentielle Gefahren verbergen und Probleme entstehen könnten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923456</guid><dc:creator><![CDATA[Horst2]]></dc:creator><pubDate>Mon, 21 Nov 2005 15:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 15:59:02 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>höchste Warnstufe finde ich auf jeden Fall sinnvoll!<br />
In Fällen, wo eine Warning definitiv fehl am Platz ist, würde ich sie<br />
per Hand ausstellen (#pragma warning()).<br />
Und Endlosschleifen würde ich mir for(;;) machen.</p>
<p>Jockel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923459</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 21 Nov 2005 15:59:02 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 16:00:04 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">do
{
  //...
} while (TRUE);
// absolut berechtigte Warnung
</code></pre>
<pre><code class="language-cpp">// Problem
char c = 0xE8;
// wenn char signed ist, passt 0xE8 da nit rein, also völlig zu recht gewarnt
</code></pre>
<pre><code class="language-cpp">// Problem
InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  // parameter hier nach void casten
  (void)param1;
  ....
  return NOT_SUPPORTED;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/923461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923461</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Mon, 21 Nov 2005 16:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 16:08:58 GMT]]></title><description><![CDATA[<p>versuch mal vs2005 und erwarte tausende deprecated meldungen... :p</p>
<blockquote>
<pre><code class="language-cpp">// Problem
do
{
  //...
} while (TRUE);

// beschwert sich über den konstanten Ausdruck als Bedingung

// Alternative
BOOL bEndless = TRUE;
do
{

} while (bEndless);

// auch nicht wirklich hübsch
</code></pre>
</blockquote>
<p>machs mit</p>
<pre><code class="language-cpp">for ( ;; ) {}
</code></pre>
<p>ist nat. geschmackssache (ich mag die for variante sowieso mehr) - und den compiler machts glücklich.</p>
<blockquote>
<pre><code class="language-cpp">// Problem
char c = 0xE8;

// beschwert sich über verkürzten konstanten Ausdruck??? Ich hätte eigentlich lieber gern eine genaue kopie des Bytes ohne verkürzung nur wie?
</code></pre>
</blockquote>
<p>hex-literale sind vorzeichenlos, char auf bei vc aber per default vorzeichenbehaftet - hier kommt es also zu einer konvertierung - insofern ist die warnung berechtigt.</p>
<blockquote>
<pre><code class="language-cpp">// Problem
InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  return NOT_SUPPORTED;
}

// beschwert sich das ich die Parameter nicht verwende. Aber wozu denn auch, die se implementation dient ja nur als abfangmechanismus für nicht implementierte Funktionen.

InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  param1 = param1;
  param2 = param2;
  param3 = param3;

  return NOT_SUPPORTED;
}

// man oh man. ziemlicher mist und auch nicht ganz ungefährlich
</code></pre>
</blockquote>
<p>eine der weniger nützlichen warnungen.<br />
wenn du bereit bist, ein (void)x; zu schreiben - und dann kann dir evtl. ein 'expression has no effekt' um die ohren fliegen - kannst du genausogut die namen der paramter in der definition auskommentieren.<br />
aber es gibt noch schlimmerere (4710/4711) z.b. :p oder auch 4668.<br />
Mein Favorit is 4619: #pragma warning : there is no warning number 'number' - als ob es ein schaden wäre, eine warnung, die nicht existiert, abzuschalten</p>
<p>/W4 aktiviert übrigens nicht alle warnungen - dafür musst du /Wall verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923467</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 21 Nov 2005 16:08:58 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 17:00:39 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">InterfaceBasis::ZumUeberschreiben(int, int, int)
{
  return NOT_SUPPORTED;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/923508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923508</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Mon, 21 Nov 2005 17:00:39 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 21:00:10 GMT]]></title><description><![CDATA[<p>Vielen dank für die Tips.</p>
<p>Also auf das mit der for endlosschleife hätte man kommen können, nagut;)</p>
<p>Die Idee mit den Parametern nur mit Typen finde ich auch klasse das dürfte auch helfen.</p>
<p>Bei der Wertzuweisung sehe ich aber sein wirkliches Problem immer noch nicht. Er beschwert sich das er den Wert verkürzt aber das ist überhaupt nicht das was ich von ihm will (und ich hoffe auch nicht das was er tut, sonst hab ich an der stelle wirklich mehr probleme als eine einfache Warnung). Ich will einfach nur das er die char variable für die Zuweisung wie ein Byte ansieht vollkommen unabhängig davon ob das ding nun im späteren verlauf als vorzeichenbehaftet oder nicht angesehen wird, sprich ein</p>
<p>memcpy(&amp;c, &quot;\xE8&quot;, 1);</p>
<p>und das tut er ja soweit ich weiß auch. dementsprechend verkürzt er ja keinen wert sondern deren interpretation ändert sich von 232 in -24. Das er warnt ist ja auch vollkommen okay, aber warum hat er trotz eines casts immer noch ein problem? Wenn ich sowas schreibe gibts keine Warnung:</p>
<p>unsigned long l;<br />
char c = (char)l;</p>
<p>und da kann es wirklich gut passieren das informationen verloren gehen und sich nicht nur deren interpretation ändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923829</guid><dc:creator><![CDATA[template]]></dc:creator><pubDate>Mon, 21 Nov 2005 21:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 21:13:03 GMT]]></title><description><![CDATA[<p>template schrieb:</p>
<blockquote>
<p>Wenn ich sowas schreibe gibts keine Warnung:</p>
</blockquote>
<p>Weil der Compiler davon ausgeht, dass wenn du schon einen cast verwendest, du auch genau weißt, was du tust.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923850</guid><dc:creator><![CDATA[davie]]></dc:creator><pubDate>Mon, 21 Nov 2005 21:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 21:55:46 GMT]]></title><description><![CDATA[<pre><code>char c = '\xE8';
</code></pre>
<p>0xE8 ist vom Typ int. Wenn Du einen int einem char zuweist, kann das gefährlich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923900</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923900</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Mon, 21 Nov 2005 21:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Mon, 21 Nov 2005 22:08:19 GMT]]></title><description><![CDATA[<p>template schrieb:</p>
<blockquote>
<p>Also auf das mit der for endlosschleife hätte man kommen können, nagut;)</p>
</blockquote>
<p>Nene. Es geht hier nicht darum, eine Technik zu finden, um die Compiler-Warnung auszuhebeln. while( true ) mit break ist manchmal schlechter Stil und lässt sich oft übersichtlicher mit einer anständigen while-Bedingung formulieren. Daher warnt der Compiler dich. Wenn du allerdings der Meinung bist, dass dein Stil in Ordnung geht, dann stell doch diese spezielle Warnung einfach aus. Mit for( ;; ) hast du nichts besser gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923911</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 21 Nov 2005 22:08:19 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Tue, 22 Nov 2005 00:40:49 GMT]]></title><description><![CDATA[<p>Ich finde es komisch das du eine do...while Schleife für das erste Beispiel genommen hast. Macht für mich den Eindruck als du du den Sinn davon nicht verstanden hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/923938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/923938</guid><dc:creator><![CDATA[............]]></dc:creator><pubDate>Tue, 22 Nov 2005 00:40:49 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Tue, 22 Nov 2005 07:51:37 GMT]]></title><description><![CDATA[<p>Ja gut, aber warum glaubt mir der compiler dann nicht das ich mit dem hex zu char cast weis was ich tue?</p>
<p>Ja einen int in einen char zu konvertieren ist möglicherweise verlustbehaftet aber gerade in diesem fall weiß der compiler ja sicher das der Platz ausreicht, weil die Konstante ohne bitverluste in einem Byte unterzubringen ist.</p>
<p>Naja eigentlich geht es mit unter schon darum den Code warnungsentsprechend umzustellen. Gut ich gebe zu mit einer komplett leeren for schleife ist das ganze ein bischen sauberer als mit dem Risiko das der compiler aus dem while (TRUE) ein</p>
<p>mov ax, 1<br />
jnz schleifenanfang</p>
<p>macht, aber so im großen und ganzen 100%tig hübsch ist die for( ;; ) ja nun rein leserlich auch nicht wirklich.</p>
<p>Und mir ist durchaus bewusst, dass dass nicht der normale Weg ist eine schleife mit einem break zu beenden aber es geht eben manchmal einfacher:</p>
<pre><code class="language-cpp">do
{
  /* tue was */
  if (/* tue was anderes */ == 0) break;
  /* tue noch was anderes */
} while (TRUE);

// anstatt

int stayinloop = 1;
do
{
  /* tue was */
  if (/* tue was anderes */ == 0) stayinloop = 0;
  if (stayinloop)
  {
    /* tue noch was anderes */
  }
} while (stayinloop);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/924018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/924018</guid><dc:creator><![CDATA[template]]></dc:creator><pubDate>Tue, 22 Nov 2005 07:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Tue, 22 Nov 2005 08:12:29 GMT]]></title><description><![CDATA[<p>template schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Problem
InterfaceBasis::ZumUeberschreiben(int param1, int param2, int param3)
{
  return NOT_SUPPORTED;
}
</code></pre>
</blockquote>
<p>Soweit ich weiss, muß man in C++ keinen Parameternamen angeben. Der GCC meckert hier auch, aber nicht bei folgendem Code:</p>
<pre><code class="language-cpp">InterfaceBasis::ZumUeberschreiben(int, int, int)
{
  return NOT_SUPPORTED;
}
</code></pre>
<p>Es ist halt nur gefährlich manchmal einen Parameternamen wegzunehmen, weil die Warnung doch ein Anzeichen für einen Bug sein kann. Aber insgesamt halte ich das Verhalten für sinnvoll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/924027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/924027</guid><dc:creator><![CDATA[Ponto]]></dc:creator><pubDate>Tue, 22 Nov 2005 08:12:29 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Tue, 22 Nov 2005 08:14:38 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char c = '\0xE8';
</code></pre>
<p>0xE8 ist vom Typ int. Wenn Du einen int einem char zuweist, kann das gefährlich sein.</p>
</blockquote>
<p>Das ist nicht richtig. Character-Literale sind in C++ vom Typ char. In C war das anders.</p>
<p>Und char c = 0xE8 ist sehr wohl verlustbehaftet, wenn char signed ist, denn 0xE8 ist größer als 0x7F, der größte signed char. Der Standard verspricht keine Bitdarstellung im 2er-Komplement, auch wenn das üblich ist. Eine Darstellung mit Vorzeichen-Bit wäre genauso möglich - wo dann 0xE8 nicht mehr so einfach sinnvoll umgewandelt werden könnte.</p>
<pre><code class="language-cpp">char c = '\0xE8';
</code></pre>
<p>sollte AFAIK aber korrekt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/924028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/924028</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Tue, 22 Nov 2005 08:14:38 GMT</pubDate></item><item><title><![CDATA[Reply to Warnungsfreien code schreiben.... on Tue, 22 Nov 2005 12:08:38 GMT]]></title><description><![CDATA[<p>template schrieb:</p>
<blockquote>
<p>Und mir ist durchaus bewusst, dass dass nicht der normale Weg ist eine schleife mit einem break zu beenden aber es geht eben manchmal einfacher:</p>
</blockquote>
<p>Geht doch nicht darum, sondern um den Fall, das deine Condition niemals eintrifft, die den Break schmeisst.</p>
<p>Ich hab mir z.B: deshalb angewöhnt bei &quot;endlosschleifen&quot; immer das Abbruchkriterium auf einen Schliess-Request zu setzen. Selbst wenn sich die Applikation aufhängt, kann ich sie dann jederzeit noch schliessen und die Kontrolle behalten. Gegenteiliges ist der Fall, wenn die Applikation nicht mehr reagiert, sich nicht beenden lässt und dann per TM aus dem Speicher entfernt wird.</p>
<p>Das Selbe gilt übrigens auch für irgendwelche WaitFor*Objects-Aurufe in der WinAPI, etc. Hier habe ich mir ebenfalls angewöhnt, nur noch auf multiple Obejkte zu warten, wobei eines davon immer der Close-Event war, der bei einem Close-Request ausgelöst wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/924199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/924199</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Tue, 22 Nov 2005 12:08:38 GMT</pubDate></item></channel></rss>