<?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[#define mit do{...}while(0) obsolet: Neu mit Lamdas!]]></title><description><![CDATA[<p>Jeder Code hat immer mal wieder ein</p>
<pre><code class="language-cpp">#define FOO(x) do { ... } while(0)
</code></pre>
<p>drin.</p>
<p>Heute kam mir ein Geistesblitz: Man kann neu Lambdas verwenden!</p>
<pre><code class="language-cpp">#define FOO(x) ((void)([](){ ... })())
</code></pre>
<p>Es ist sogar möglich, Werte zurückzugeben:</p>
<pre><code class="language-cpp">#define FOO(x) ([](){ ... return ... }())
</code></pre>
<p>Jetzt kann man Makros endlich mit einem Komma-Operator verwenden:</p>
<pre><code class="language-cpp">for (...)
  FOO(x), FOO(y); // ging vorher nicht
</code></pre>
<p>Was haltet ihr davon? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326205/define-mit-do-while-0-obsolet-neu-mit-lamdas</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 06:20:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326205.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Jun 2014 10:29:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 10:29:40 GMT]]></title><description><![CDATA[<p>Jeder Code hat immer mal wieder ein</p>
<pre><code class="language-cpp">#define FOO(x) do { ... } while(0)
</code></pre>
<p>drin.</p>
<p>Heute kam mir ein Geistesblitz: Man kann neu Lambdas verwenden!</p>
<pre><code class="language-cpp">#define FOO(x) ((void)([](){ ... })())
</code></pre>
<p>Es ist sogar möglich, Werte zurückzugeben:</p>
<pre><code class="language-cpp">#define FOO(x) ([](){ ... return ... }())
</code></pre>
<p>Jetzt kann man Makros endlich mit einem Komma-Operator verwenden:</p>
<pre><code class="language-cpp">for (...)
  FOO(x), FOO(y); // ging vorher nicht
</code></pre>
<p>Was haltet ihr davon? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402714</guid><dc:creator><![CDATA[dersinndeslambdas]]></dc:creator><pubDate>Fri, 06 Jun 2014 10:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 10:37:15 GMT]]></title><description><![CDATA[<p>dersinndeslambdas schrieb:</p>
<blockquote>
<p>Jeder Code hat immer mal wieder ein</p>
<pre><code class="language-cpp">#define FOO(x) do { ... } while(0)
</code></pre>
<p>drin.</p>
</blockquote>
<p>Nein?!! Wieso auch? (Auchw enn mir das entfernt irgendwo bekannt vorkommt, aber ich weis nicht mehr wo ich das mal gesehen hab oo)</p>
<p>Daher halt ich von sowas Abstand...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402715</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 06 Jun 2014 10:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 10:37:49 GMT]]></title><description><![CDATA[<p>Hast du gleich einen konkreten Fall, wo du den do-while-Trick <strong>und</strong> den Komma-Operator benötigst? Besonders Letzteres kommt mir etwas fragwürdig vor...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402716</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 06 Jun 2014 10:37:49 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 10:41:44 GMT]]></title><description><![CDATA[<p>don't feed the troll</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402718</guid><dc:creator><![CDATA[dersinndeslambdas]]></dc:creator><pubDate>Fri, 06 Jun 2014 10:41:44 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 10:49:56 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>dersinndeslambdas schrieb:</p>
<blockquote>
<p>Jeder Code hat immer mal wieder ein</p>
<pre><code class="language-cpp">#define FOO(x) do { ... } while(0)
</code></pre>
<p>drin.</p>
</blockquote>
<p>Nein?!! Wieso auch? (Auchw enn mir das entfernt irgendwo bekannt vorkommt, aber ich weis nicht mehr wo ich das mal gesehen hab oo)</p>
<p>Daher halt ich von sowas Abstand...</p>
</blockquote>
<p><a href="https://gcc.gnu.org/onlinedocs/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon" rel="nofollow">https://gcc.gnu.org/onlinedocs/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402720</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Fri, 06 Jun 2014 10:49:56 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 14:49:11 GMT]]></title><description><![CDATA[<pre><code>#define FOO(x) ((void)([](){ ... })())
</code></pre>
<p>Der Cast ist überflüssig. Der Ausdruck hat schon Typ <code>void</code> wenn kein <code>return</code> -Statement drinsteht. Das leere Klammerpaar ist auch unnötig.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code>#define FOO(x) (([]{ ... })())
</code></pre>
<p>Sonst schließe ich mich Nexus an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402749</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 06 Jun 2014 14:49:11 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 15:10:14 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Hast du gleich einen konkreten Fall, wo du den do-while-Trick <strong>und</strong> den Komma-Operator benötigst? Besonders Letzteres kommt mir etwas fragwürdig vor...</p>
</blockquote>
<p>Benötigen ist das falsche Wort, aber praktisch finde ich es schon. Zum einen um zwei zusammengehörige Operationen auf einer Zeile zu halten (siehe Beispiel im ersten Post), zum andern um in if-Bedingungen einen Nebeneffekt einzubauen (z.B. SKIP_SPACES) ohne zwei ifs grundlos zu nesten.</p>
<p>Selbst wenn das nicht oft vorkommt, wenn man schon die Gelegenheit hat, sollte man es richtig machen.</p>
<p>Wichtig ist auch, dass nun Rückgabewerte möglich sind.</p>
<pre><code class="language-cpp">if (FOO(x)) // geht nicht mit do-while(0)
  FOO(y);   // resp. dem {...}-Trick
else {}     // weil das ; das if vom else trennt.
</code></pre>
<p>Alles mit Lambdas zu machen führt auch zu Einheitlichkeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402754</guid><dc:creator><![CDATA[dersinndeslambdas]]></dc:creator><pubDate>Fri, 06 Jun 2014 15:10:14 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 15:27:33 GMT]]></title><description><![CDATA[<p>Ich persönlich brauche auch nicht den do-while-Trick bei Makros.<br />
Es gibt bei mir nämlich nur zwei Arten von Makros.<br />
Einmal die Meta-Makros zur Codegenerierung mehrerer ähnlich aussehender Funktion (was allerdings nicht durch Templates lösbar ist...) und dann Diagnostics-Makros wo ich nur Makros verwende, weil ich an die Funktions- und Dateinamen kommen will.<br />
Im ersteren ist das egal, beim Zweiten ist das eh nur ein einfacher Funktionsauruf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402759</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 06 Jun 2014 15:27:33 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 15:39:51 GMT]]></title><description><![CDATA[<blockquote>
<p>Einmal die Meta-Makros zur Codegenerierung mehrerer ähnlich aussehender Funktion</p>
</blockquote>
<p>Beispiel bitte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich glaube das auch schon mal gebraucht zu haben, aber ich bin gerade im &quot;kann man bestimmt Widerlegen-Rausch&quot;. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2402764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402764</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 06 Jun 2014 15:39:51 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 16:01:57 GMT]]></title><description><![CDATA[<p>@dersinndeslambdas<br />
Hast du mal probiert ob aktuelle Compiler das auch vernünftig optimieren können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402767</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 06 Jun 2014 16:01:57 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 17:51:37 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Einmal die Meta-Makros zur Codegenerierung mehrerer ähnlich aussehender Funktion</p>
</blockquote>
<p>Beispiel bitte. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich glaube das auch schon mal gebraucht zu haben, aber ich bin gerade im &quot;kann man bestimmt Widerlegen-Rausch&quot;. <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>
</blockquote>
<p>Das stammt aus meiner eigenen Implementierung einer iostream-Bibliothek*, genau genommen aus der Implementierung zum Pendant von std::num_put:</p>
<pre><code>#define MY_IMPL_WRITE_INTEGRAL_DIGITS(NAME, BASE) \
template &lt;typename IntegralT, typename OIterator, class Encoding&gt; \
void write_integral_digits_##NAME(IntegralT value, OIterator &amp;iter, \
                                  const numeric&lt;Encoding&gt; &amp;numeric_info) \
{ \
    streamsize num_digits = 0; \
    do \
    { \
        print_code_point(iter, numeric_info.digit_to_char(value % BASE)); \
        value /= BASE; \
        if (value &gt; 0 &amp;&amp; numeric_info.is_##NAME##_sep_after(num_digits++)) \
            print_code_point(iter, numeric_info.NAME##_sep()); \
    } while (value &gt; 0); \
}

MY_IMPL_WRITE_INTEGRAL_DIGITS(decimal, 10)
MY_IMPL_WRITE_INTEGRAL_DIGITS(hexadecimal, 16)
MY_IMPL_WRITE_INTEGRAL_DIGITS(octal, 8)

#undef MY_IMPL_WRITE_INTEGRAL_DIGITS
</code></pre>
<p>edit:<br />
Ach ja, übrigens:<br />
<a href="https://github.com/Arcoth/VTMPL/blob/master/algorithms.hxx" rel="nofollow">https://github.com/Arcoth/VTMPL/blob/master/algorithms.hxx</a></p>
<pre><code>#define DEFINE_FO( name, ... ) \
template&lt;index_type a&gt; \
struct name \
{ \
template&lt;index_type b&gt; \
struct function : std::integral_constant&lt;index_type, (__VA_ARGS__)&gt; {}; \
}

DEFINE_FO(add, b + a);
DEFINE_FO(xor_, b xor a);
DEFINE_FO(multiply, b * a);
DEFINE_FO(modulo, b % a);

#undef DEFINE_FO
#define DEFINE_FO( name, ... ) \
template&lt;index_type a&gt; struct name : std::integral_constant&lt;index_type, (__VA_ARGS__)&gt; {}

DEFINE_FO( square, a*a );
DEFINE_FO( invert, -a );
#undef DEFINE_FO
</code></pre>
<p>/edit</p>
<p>*Ja, ich habe sonst nichts zu tun. Deshalb implementiere ich quasi die komplette Standardbibliothek neu und &quot;besser&quot; (vom Design her). Vieles sind einfach nur Wrapper (mein std::vector z.B., nur an mein Iterator-Konzept angepasst und mit meinem Errorchecking), anderes habe ich komplett implementiert. Darunter auch der komplette IO-Teil. Meine Implementierung hat eine kleinere Hierachie, ist nicht ganz so konfigurierbar, einfacher zu nutzen sowohl was Manipulatoren als auch streambufs angeht, Multibyteencoding-aware und formattiert Integer ganze 20ns schneller als die Implementierung meines Compilers ( <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2402782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402782</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 06 Jun 2014 17:51:37 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 18:24:19 GMT]]></title><description><![CDATA[<blockquote>
<p>numeric_info.is_##NAME##_sep_after(num_digits++)</p>
</blockquote>
<p>Warum ist <code>is_##NAME##_sep_after</code> fest für alle Basen einzeln definiert? Warum kein Template, dass die Basis als Template-Argument nimmt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402795</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 06 Jun 2014 18:24:19 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 18:27:32 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>numeric_info.is_##NAME##_sep_after(num_digits++)</p>
</blockquote>
<p>Warum ist <code>is_##NAME##_sep_after</code> fest für alle Basen einzeln definiert? Warum kein Template, dass die Basis als Template-Argument nimmt?</p>
</blockquote>
<p>virtual Memberfunction.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402796</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 06 Jun 2014 18:27:32 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 18:31:03 GMT]]></title><description><![CDATA[<p>Warum es nicht wie alle normalen Menschen machen und die Basis als Funktionsparameter übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402797</guid><dc:creator><![CDATA[warbat]]></dc:creator><pubDate>Fri, 06 Jun 2014 18:31:03 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 18:32:25 GMT]]></title><description><![CDATA[<blockquote>
<p>Ach ja, übrigens:<br />
<a href="https://github.com/Arcoth/VTMPL/blob/master/algorithms.hxx" rel="nofollow">https://github.com/Arcoth/VTMPL/blob/master/algorithms.hxx</a></p>
</blockquote>
<p>Da haste mich glatt mit meinem eigenen Code erwischt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>(VTMPL muss ich mal wieder auffrischen, mach' mich dran)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402798</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 06 Jun 2014 18:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Fri, 06 Jun 2014 18:34:55 GMT]]></title><description><![CDATA[<p>warbat schrieb:</p>
<blockquote>
<p>Warum es nicht wie alle normalen Menschen machen und die Basis als Funktionsparameter übergeben?</p>
</blockquote>
<p>Ich hatte vorschnellen Optimierungswahn und wollte ifs vermeiden.<br />
Eine Art Tag-Dispatching wäre allerdings ok, aber jetzt ist es zu spät.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402799</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 06 Jun 2014 18:34:55 GMT</pubDate></item><item><title><![CDATA[Reply to #define mit do{...}while(0) obsolet: Neu mit Lamdas! on Sat, 07 Jun 2014 07:33:59 GMT]]></title><description><![CDATA[<p>dersinndeslambdas schrieb:</p>
<blockquote>
<p>Jeder Code hat immer mal wieder ein</p>
<pre><code class="language-cpp">#define FOO(x) do { ... } while(0)
</code></pre>
<p>drin.</p>
</blockquote>
<p>oder ähnliche Schreibweisen. gcc erzwingt irgendwie while(0){}, weil er in allen anderen Schreibweisen rumwarnt.</p>
<p>dersinndeslambdas schrieb:</p>
<blockquote>
<p>Heute kam mir ein Geistesblitz: Man kann neu Lambdas verwenden!</p>
<pre><code class="language-cpp">#define FOO(x) ((void)([](){ ... })())
</code></pre>
<p>Es ist sogar möglich, Werte zurückzugeben:</p>
<pre><code class="language-cpp">#define FOO(x) ([](){ ... return ... }())
</code></pre>
<p>Jetzt kann man Makros endlich mit einem Komma-Operator verwenden:</p>
<pre><code class="language-cpp">for (...)
  FOO(x), FOO(y); // ging vorher nicht
</code></pre>
<p>Was haltet ihr davon? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Sehr gute Idee! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Nun paßt __asm int 3; ins ASSERT und es bleibt ein Ausdruck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2402843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2402843</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 07 Jun 2014 07:33:59 GMT</pubDate></item></channel></rss>