<?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[macros, debug macros, werden sie wirklich entfernt?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Programm geschrieben. Nun möchte ich mir gern zum testen bei den jeweiligen Funktionen Informationen ausgeben lassen. Derzeit habe ich in der Klasse eine Methode -&gt;debug(...args). Dieser übergebe ich dann alle möglichen Informationen. Nun ist es so, das wenn ich diese Details nicht mehr möchte, ich in der Methode vorher ganz simpel prüfe &quot;if (this-&gt;_debug == true)&quot; und dann ggf. direkt abbreche.</p>
<p>Das führt aber dazu, das selbst wenn _debug false ist, die Dateien sehr groß werden und vor allem der Sprung zu debug(...args) dennoch erfolgt. Und auch alle Werte erst mal auf den stack gepackt werden.</p>
<p>Ich könnte jetzt überall so etwas wie</p>
<pre><code>#ifdef DEBUG
   Klasse-&gt;debug(&quot;Was auch immer %s&quot;, &quot;noch ein Text&quot;);
#endif
</code></pre>
<p>machen, was ich Persönlich aber sehr umständlich und unschön finde.<br />
Jetzt meine Frage dazu, könnte ich nicht auch ein komplettes Macro definieren:</p>
<pre><code>#ifdef DEBUG
#define DEBUG_MSG(msg, ... args); \
// weiterer code
#else
#define DEBUG_MSG(nothing);
#endif
</code></pre>
<p>und dann überall halt . DEBUG_MSG(&quot;Text: %s&quot;, &quot;Test&quot;); nutzen und würde der compiler wenn DEBUG aus ist alle diese Zeilen wirklich löschen?</p>
<p>mfg Spoocy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/340017/macros-debug-macros-werden-sie-wirklich-entfernt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 12:21:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/340017.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 14 Oct 2016 08:49:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to macros, debug macros, werden sie wirklich entfernt? on Fri, 14 Oct 2016 08:49:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein kleines Programm geschrieben. Nun möchte ich mir gern zum testen bei den jeweiligen Funktionen Informationen ausgeben lassen. Derzeit habe ich in der Klasse eine Methode -&gt;debug(...args). Dieser übergebe ich dann alle möglichen Informationen. Nun ist es so, das wenn ich diese Details nicht mehr möchte, ich in der Methode vorher ganz simpel prüfe &quot;if (this-&gt;_debug == true)&quot; und dann ggf. direkt abbreche.</p>
<p>Das führt aber dazu, das selbst wenn _debug false ist, die Dateien sehr groß werden und vor allem der Sprung zu debug(...args) dennoch erfolgt. Und auch alle Werte erst mal auf den stack gepackt werden.</p>
<p>Ich könnte jetzt überall so etwas wie</p>
<pre><code>#ifdef DEBUG
   Klasse-&gt;debug(&quot;Was auch immer %s&quot;, &quot;noch ein Text&quot;);
#endif
</code></pre>
<p>machen, was ich Persönlich aber sehr umständlich und unschön finde.<br />
Jetzt meine Frage dazu, könnte ich nicht auch ein komplettes Macro definieren:</p>
<pre><code>#ifdef DEBUG
#define DEBUG_MSG(msg, ... args); \
// weiterer code
#else
#define DEBUG_MSG(nothing);
#endif
</code></pre>
<p>und dann überall halt . DEBUG_MSG(&quot;Text: %s&quot;, &quot;Test&quot;); nutzen und würde der compiler wenn DEBUG aus ist alle diese Zeilen wirklich löschen?</p>
<p>mfg Spoocy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511527</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Fri, 14 Oct 2016 08:49:42 GMT</pubDate></item><item><title><![CDATA[Reply to macros, debug macros, werden sie wirklich entfernt? on Fri, 14 Oct 2016 09:11:41 GMT]]></title><description><![CDATA[<p>Das würde das machen, was du willst, mit der kleinen Klarstellung, dass der Compiler das nicht entfernen würde, sondern dass der Compiler es gar nicht erst zu Gesicht bekommt, weil der Präprozessor es längst entfernt hat, bevor der Compiler überhaupt dran kommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511528</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511528</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 14 Oct 2016 09:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to macros, debug macros, werden sie wirklich entfernt? on Fri, 14 Oct 2016 09:13:28 GMT]]></title><description><![CDATA[<p>Ist das auch ein Weg den man so gehen sollte/kann ohne das alle schreien würden &quot;um Gottes willen&quot;?.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511529</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Fri, 14 Oct 2016 09:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to macros, debug macros, werden sie wirklich entfernt? on Fri, 14 Oct 2016 09:44:10 GMT]]></title><description><![CDATA[<p>Hm, wenn man sich der potentiellen Probleme bewusst ist...</p>
<p>Finde <a href="http://www.drdobbs.com/cpp/a-highly-configurable-logging-framework/225700666" rel="nofollow">http://www.drdobbs.com/cpp/a-highly-configurable-logging-framework/225700666</a> ganz interessant, insbesondere:</p>
<blockquote>
<p>Preprocessor implemented logging often has side effects. For instance, if you want to call a function always and for debugging purpose you print its return value with the help of a logging macro like LOGGING(ret=f()) the function is only called if logging is active. If the macro is empty defined to disable logging, the function will never be called. Such Heisenbugs are hard to find.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2511532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511532</guid><dc:creator><![CDATA[wob]]></dc:creator><pubDate>Fri, 14 Oct 2016 09:44:10 GMT</pubDate></item><item><title><![CDATA[Reply to macros, debug macros, werden sie wirklich entfernt? on Fri, 14 Oct 2016 12:48:52 GMT]]></title><description><![CDATA[<p>Ich würde das eher in dieser Art lösen:</p>
<pre><code>struct Klasse
{
    #ifdef DEBUG
        void debug(const string&amp; message)
        {
            cerr &lt;&lt; message &lt;&lt; &quot;\n&quot;;
        }
    #else
        void debug(const string&amp; message)
        {
        }
    #endif
};
</code></pre>
<p>Das hat den Vorteil dass man sich weder den Code mit <code>#ifdef</code> s zupflastern, noch überall Makros verwenden muss<br />
(die besonders dann schnell zum Krampf werden wenn sie kurze, eingängliche Namen haben wie DEBUG_MSG und man in dem Projekt auch fremden Code einbindet ;)).</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511546</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Fri, 14 Oct 2016 12:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to macros, debug macros, werden sie wirklich entfernt? on Fri, 14 Oct 2016 13:12:18 GMT]]></title><description><![CDATA[<p>Hier würde aber wieder das Problem entstehen das an den stellen wo ich dann</p>
<p>Klasse-&gt;debug(&quot;Irgend ein text: %s&quot;, andereKlasse-&gt;functionsaufruf());</p>
<p>aufrufe, zum einen &quot;andereKlasse-&gt;functionsaufruf()&quot; ausgeführt wird (was ich dann gar nicht mehr möchte) und zum anderem der spring in die leere debug Funktion dennoch erfolgt oder?</p>
<p>Wenn Debug ausgeschaltet ist, soll es so sein als hätte ich nirgendwo irgend einen Debugtext / Funktion aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511550</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Fri, 14 Oct 2016 13:12:18 GMT</pubDate></item><item><title><![CDATA[Reply to macros, debug macros, werden sie wirklich entfernt? on Fri, 14 Oct 2016 13:34:22 GMT]]></title><description><![CDATA[<p>Angelehnt an das <code>KdPrint</code> Makro des Windows DDK:</p>
<pre><code class="language-cpp">namespace DebugDetail {
    inline void Nothing() {}
} // namespace DebugDetail

#ifndef NDEBUG
#define MY_DEBUG_PRINTF(x) ::std::printf x
#else
#define MY_DEBUG_PRINTF(x) ::DebugDetail::Nothing()
#endif

//--------------------------------------------------

void SomeFunction()
{
    MY_DEBUG_PRINTF((&quot;Formatstring %d&quot;, 123));
}
</code></pre>
<p>Iostream-Style geht auch, da braucht man aber ein wesentlich aufwendigeres Makro.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2511553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2511553</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 14 Oct 2016 13:34:22 GMT</pubDate></item></channel></rss>