<?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[Bedingte Ausgabe]]></title><description><![CDATA[<p>Ich möchte im Consolen Modus Daten zur Kontrolle ausgeben. Bisher verunstalte ich meine Codes mit unzähligen #ifdefs.</p>
<pre><code class="language-cpp">std::wstring path(InitPath());
    int id = InitID();
#ifdef _CONSOLE
    std::wcout &lt;&lt; path &lt;&lt; L&quot; &quot; &lt;&lt; id &lt;&lt; std::endl;
#endif  // _CONSOLE
</code></pre>
<p>Gibts eine elegante Möglichkeit das zu umgehen? Zum Beispiel einen</p>
<pre><code class="language-cpp">std::wostream&amp; trace(std::wcout);
</code></pre>
<p>definieren, den ich zentral via</p>
<pre><code class="language-cpp">#ifdef _CONSOLE
    std::wostream&amp; trace(std::wcout);
#else
    std::wostream&amp; trace(/* NIRVANA */);
#endif  // _CONSOLE
</code></pre>
<p>umlenken kann. Werden keine Ausgaben benötigt, dann wird's ins Nirvana gestreamt. Also keine Ausgaben auch nicht in ein physikalisches File.</p>
<pre><code class="language-cpp">trace &lt;&lt; path &lt;&lt; L&quot; &quot; &lt;&lt; id &lt;&lt; std::endl;
</code></pre>
<p>Danke für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308959/bedingte-ausgabe</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 13:02:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308959.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Oct 2012 13:14:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bedingte Ausgabe on Wed, 10 Oct 2012 13:14:49 GMT]]></title><description><![CDATA[<p>Ich möchte im Consolen Modus Daten zur Kontrolle ausgeben. Bisher verunstalte ich meine Codes mit unzähligen #ifdefs.</p>
<pre><code class="language-cpp">std::wstring path(InitPath());
    int id = InitID();
#ifdef _CONSOLE
    std::wcout &lt;&lt; path &lt;&lt; L&quot; &quot; &lt;&lt; id &lt;&lt; std::endl;
#endif  // _CONSOLE
</code></pre>
<p>Gibts eine elegante Möglichkeit das zu umgehen? Zum Beispiel einen</p>
<pre><code class="language-cpp">std::wostream&amp; trace(std::wcout);
</code></pre>
<p>definieren, den ich zentral via</p>
<pre><code class="language-cpp">#ifdef _CONSOLE
    std::wostream&amp; trace(std::wcout);
#else
    std::wostream&amp; trace(/* NIRVANA */);
#endif  // _CONSOLE
</code></pre>
<p>umlenken kann. Werden keine Ausgaben benötigt, dann wird's ins Nirvana gestreamt. Also keine Ausgaben auch nicht in ein physikalisches File.</p>
<pre><code class="language-cpp">trace &lt;&lt; path &lt;&lt; L&quot; &quot; &lt;&lt; id &lt;&lt; std::endl;
</code></pre>
<p>Danke für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2258837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2258837</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Wed, 10 Oct 2012 13:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Wed, 10 Oct 2012 13:21:12 GMT]]></title><description><![CDATA[<p>/dev/null?</p>
<p>edit: Oder wenn du es streng plattformunabhängig haben willst: Einfach einen fstream ohne eine Datei zu öffnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2258843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2258843</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Oct 2012 13:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Wed, 10 Oct 2012 13:21:18 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>/dev/null?</p>
</blockquote>
<p>Was meinst du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2258844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2258844</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Wed, 10 Oct 2012 13:21:18 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Wed, 10 Oct 2012 13:31:29 GMT]]></title><description><![CDATA[<p>Tomahawk schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>/dev/null?</p>
</blockquote>
<p>Was meinst du?</p>
</blockquote>
<p>Dateistream mit /dev/null als Ausgabedatei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2258847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2258847</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Oct 2012 13:31:29 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Wed, 10 Oct 2012 14:06:27 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;

#ifdef _DEBUG
std::wostream&amp; trace(std::wcout);
#else
std::wofstream trace;
#endif

int main() {
  trace &lt;&lt; L&quot;Hello world!&quot; &lt;&lt; std::endl;
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2258859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2258859</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Wed, 10 Oct 2012 14:06:27 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Wed, 10 Oct 2012 19:16:22 GMT]]></title><description><![CDATA[<p>Dein Problem ist dadurch nur zur Hälfte gelöst. Die Funktionsaufrufe werden trotzdem ausgeführt (was durchaus auf die Performance geht), und dass der Compiler das wegoptimiert bezweifle ich zurecht.</p>
<p>Wäre ein Makro nicht schöner?</p>
<pre><code class="language-cpp">#ifdef _CONSOLE
    #define dump(...) dump(_VA_ARGS_)
#else
    #define dump(...)
#endif
</code></pre>
<p>Und dump ist dann eine variadic function (eher unschön) oder eine Funktion mit variadic templates (C++11).</p>
<p>Das wäre so mein Ansatz. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p><strong>Edit</strong>: Oder es geht dir gar nicht um Performance. In diesem Fall ist natürlich Sepps Lösung besser.</p>
<p><strong>Edit²</strong>: Vorschlag für den nächsten Standard: Ein neues Makro-Level, ein Präprozessor Nr.2 der vor dem ersten ausgeführt wird. Vor dem Befehl kommen Zwei Rauten.<br />
Damit auch sowas möglich ist:</p>
<pre><code class="language-cpp">##define bla #ifdef ...
</code></pre>
<p><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="🤡"
    /> <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="🤡"
    /> <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/2258993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2258993</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 10 Oct 2012 19:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Fri, 12 Oct 2012 09:57:34 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Dein Problem ist dadurch nur zur Hälfte gelöst. Die Funktionsaufrufe werden trotzdem ausgeführt (was durchaus auf die Performance geht), und dass der Compiler das wegoptimiert bezweifle ich zurecht.</p>
<p>Wäre ein Makro nicht schöner?</p>
<pre><code class="language-cpp">#ifdef _CONSOLE
    #define dump(...) dump(_VA_ARGS_)
#else
    #define dump(...)
#endif
</code></pre>
<p>Und dump ist dann eine variadic function (eher unschön) oder eine Funktion mit variadic templates (C++11).</p>
<p>Das wäre so mein Ansatz. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p><strong>Edit</strong>: Oder es geht dir gar nicht um Performance. In diesem Fall ist natürlich Sepps Lösung besser.</p>
<p><strong>Edit²</strong>: Vorschlag für den nächsten Standard: Ein neues Makro-Level, ein Präprozessor Nr.2 der vor dem ersten ausgeführt wird. Vor dem Befehl kommen Zwei Rauten.<br />
Damit auch sowas möglich ist:</p>
<pre><code class="language-cpp">##define bla #ifdef ...
</code></pre>
<p><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="🤡"
    /> <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="🤡"
    /> <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>Klar mit einem #define!</p>
<pre><code class="language-cpp">#ifdef _CONSOLE
#define CONSOLE_EXPRESSION(x) x
#else
#define CONSOLE_EXPRESSION(x)
#endif  // _CONSOLE

int main() {
  CONSOLE_EXPRESSION(std::wcout &lt;&lt; L&quot;Hello World!&quot; &lt;&lt; std::endl);
  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2259561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259561</guid><dc:creator><![CDATA[Tomahawk]]></dc:creator><pubDate>Fri, 12 Oct 2012 09:57:34 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Fri, 12 Oct 2012 10:19:23 GMT]]></title><description><![CDATA[<p>Gab es da nicht eine Regel dass man auf define in C++ verzichten sollte, wenn es denn irgendwie geht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259573</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 12 Oct 2012 10:19:23 GMT</pubDate></item><item><title><![CDATA[Reply to Bedingte Ausgabe on Fri, 12 Oct 2012 12:10:53 GMT]]></title><description><![CDATA[<p>Grasshopper schrieb:</p>
<blockquote>
<p>Gab es da nicht eine Regel dass man auf define in C++ verzichten sollte, wenn es denn irgendwie geht?</p>
</blockquote>
<p>Nö, wieso denn das? Man sollte nur Konstanten und Enumerationen und Inline Funktionen benutzen, statt den entsprechenden Makro-Varianten. Also die Sprachfeatures mehr ausnutzen. Hier ist aber ein Makro definitiv angebracht.</p>
<p>Tomahawk schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Dein Problem ist dadurch nur zur Hälfte gelöst. Die Funktionsaufrufe werden trotzdem ausgeführt (was durchaus auf die Performance geht), und dass der Compiler das wegoptimiert bezweifle ich zurecht.</p>
<p>Wäre ein Makro nicht schöner?</p>
<pre><code class="language-cpp">#ifdef _CONSOLE
    #define dump(...) dump(_VA_ARGS_)
#else
    #define dump(...)
#endif
</code></pre>
<p>Und dump ist dann eine variadic function (eher unschön) oder eine Funktion mit variadic templates (C++11).</p>
<p>Das wäre so mein Ansatz. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
<p><strong>Edit</strong>: Oder es geht dir gar nicht um Performance. In diesem Fall ist natürlich Sepps Lösung besser.</p>
<p><strong>Edit²</strong>: Vorschlag für den nächsten Standard: Ein neues Makro-Level, ein Präprozessor Nr.2 der vor dem ersten ausgeführt wird. Vor dem Befehl kommen Zwei Rauten.<br />
Damit auch sowas möglich ist:</p>
<pre><code class="language-cpp">##define bla #ifdef ...
</code></pre>
<p><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="🤡"
    /> <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="🤡"
    /> <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>Klar mit einem #define!</p>
<pre><code class="language-cpp">#ifdef _CONSOLE
#define CONSOLE_EXPRESSION(x) x
#else
#define CONSOLE_EXPRESSION(x)
#endif  // _CONSOLE

int main() {
  CONSOLE_EXPRESSION(std::wcout &lt;&lt; L&quot;Hello World!&quot; &lt;&lt; std::endl);
  return 0;
}
</code></pre>
</blockquote>
<p><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 />
Jup, damit wäre es dann gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2259628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2259628</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 12 Oct 2012 12:10:53 GMT</pubDate></item></channel></rss>