<?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[TRACE Makro ohne footprint im Release]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich baue grad ein TRACE Makro, das im Release Modus keinen Footprint im Code hinterlassen soll. Hier mein erster Ansatz:</p>
<pre><code>#include &lt;windows.h&gt;

#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;iomanip&gt;

struct Tracer
{
   std::ostringstream oss_;

   Tracer( const char* FileName, const char* FuncName, unsigned int LineNumber )
   {
      oss_ &lt;&lt; FileName &lt;&lt; &quot;: &quot; &lt;&lt; FuncName &lt;&lt; &quot;(&quot; &lt;&lt; LineNumber &lt;&lt; &quot;): &quot;;
   }

   void trace()
   {
      ::OutputDebugString( oss_.str().c_str() );
   }

   template&lt;typename T, typename... U&gt;
   void trace( const T&amp; head, const U&amp; ...tail )
   {
      oss_ &lt;&lt; head;
      trace( tail... );
   }
};

template&lt;typename T, typename... U&gt;
void trace( const T&amp; head, const U&amp; ...tail )
{
}

#ifdef DEBUG
   #define TRACE trace;
#else
   #define TRACE Tracer( __FILE__, __func__, __LINE__ ).trace
#endif
</code></pre>
<p>Soweit, so gut. Das einzige Problem, dass der Code noch hat ist die Auswertung der Parameter im Releasemodus. Im Fall von</p>
<pre><code>TRACE( someFunc(), obj.GetName() );
</code></pre>
<p>werden <em>someFunc</em> und <em>obj.GetName()</em> noch aufgerufen, um die Parameter für die Tracefunktion zu bestimmen. Kriegt man das auch noch irgendwie eliminiert?</p>
<p>Edit:<br />
Code korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/336433/trace-makro-ohne-footprint-im-release</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Apr 2026 11:19:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/336433.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Jan 2016 09:11:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 09:48:47 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich baue grad ein TRACE Makro, das im Release Modus keinen Footprint im Code hinterlassen soll. Hier mein erster Ansatz:</p>
<pre><code>#include &lt;windows.h&gt;

#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;iomanip&gt;

struct Tracer
{
   std::ostringstream oss_;

   Tracer( const char* FileName, const char* FuncName, unsigned int LineNumber )
   {
      oss_ &lt;&lt; FileName &lt;&lt; &quot;: &quot; &lt;&lt; FuncName &lt;&lt; &quot;(&quot; &lt;&lt; LineNumber &lt;&lt; &quot;): &quot;;
   }

   void trace()
   {
      ::OutputDebugString( oss_.str().c_str() );
   }

   template&lt;typename T, typename... U&gt;
   void trace( const T&amp; head, const U&amp; ...tail )
   {
      oss_ &lt;&lt; head;
      trace( tail... );
   }
};

template&lt;typename T, typename... U&gt;
void trace( const T&amp; head, const U&amp; ...tail )
{
}

#ifdef DEBUG
   #define TRACE trace;
#else
   #define TRACE Tracer( __FILE__, __func__, __LINE__ ).trace
#endif
</code></pre>
<p>Soweit, so gut. Das einzige Problem, dass der Code noch hat ist die Auswertung der Parameter im Releasemodus. Im Fall von</p>
<pre><code>TRACE( someFunc(), obj.GetName() );
</code></pre>
<p>werden <em>someFunc</em> und <em>obj.GetName()</em> noch aufgerufen, um die Parameter für die Tracefunktion zu bestimmen. Kriegt man das auch noch irgendwie eliminiert?</p>
<p>Edit:<br />
Code korrigiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2484273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484273</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 22 Jan 2016 09:48:47 GMT</pubDate></item><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 11:02:59 GMT]]></title><description><![CDATA[<p>ich glaub der gängige trick ist es das ganze ein ein</p>
<pre><code class="language-cpp">do{ /* your code */ } while(0);
</code></pre>
<p>zu packen, das wir dann komplett raus optimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2484292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484292</guid><dc:creator><![CDATA[whiler]]></dc:creator><pubDate>Fri, 22 Jan 2016 11:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 11:26:49 GMT]]></title><description><![CDATA[<p>whiler schrieb:</p>
<blockquote>
<p>ich glaub der gängige trick ist es das ganze ein ein</p>
<pre><code class="language-cpp">do{ /* your code */ } while(0);
</code></pre>
<p>zu packen, das wir dann komplett raus optimiert.</p>
</blockquote>
<p>Der Trick mit dem <code>do while</code> ist nicht um Code weg optimieren zu lassen. Tatsächlich wird ja die Schleife genau einmal durchlaufen, also kann man das gar nicht so einfach wegoptimieren. Die <code>do while</code> Konstruktion nimmt man häufig um Makros wie Funktionsaufrufe aussehen zu lassen. Dann muss man aber das letzte Semikolon hinter dem <code>while(0)</code> weglassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2484294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484294</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 22 Jan 2016 11:26:49 GMT</pubDate></item><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 11:34:49 GMT]]></title><description><![CDATA[<p>Stichwort <strong>Variadic Macros</strong></p>
<pre><code>#ifdef DEBUG
  #define TRACE(...) Tracer( __FILE__, __func__, __LINE__ ).trace(__VA_ARGS__)
#else
  #define TRACE(...)
#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2484296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484296</guid><dc:creator><![CDATA[osdt]]></dc:creator><pubDate>Fri, 22 Jan 2016 11:34:49 GMT</pubDate></item><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 11:40:26 GMT]]></title><description><![CDATA[<p>Zum eigentlichen Problem. Möglicherweise irre ich mich aber es gibt einige Ausdrücke die nicht ausgewertet werden in C++ (unevaluated context). Ein bekannter davon ist <code>sizeof</code> . Wenn du also etwas wie <code>sizeof( trace(someFunc(), obj.GetName()) )</code> compilierst dann werden die Funktionen zur Laufzeit nicht aufgerufen, sondern nur derren Rückgabewerte vom Compilier analysiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2484298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484298</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 22 Jan 2016 11:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 12:35:01 GMT]]></title><description><![CDATA[<p>Erst ein Mal Danke für die Antworten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30299">@osdt</a><br />
Variadic Macros sind nicht typsicher, und wenn jemand den Formatspezifizierer vermurkst können seltsame Sachen passieren.</p>
<p>@sebi707<br />
Der sizeof Ansatz sieht schon ganz gut aus, aber wie kriegt man das syntaktisch hin? Mein Ansatz ersetzt ja das TRACE durch ein temp. Objekt samt Funktionsaufruf, und wenn ich das sizeof Konstrukt benutze muss ich das noch mal klammern.</p>
<p>Edit:<br />
Das geht ja noch einfacher <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>
<pre><code>#define TRACE sizeof
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2484304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484304</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 22 Jan 2016 12:35:01 GMT</pubDate></item><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 13:06:26 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30299">@osdt</a><br />
Variadic Macros sind nicht typsicher, und wenn jemand den Formatspezifizierer vermurkst können seltsame Sachen passieren.</p>
</blockquote>
<p>Ich glaub da verwechselst du was. Variadic Macros sind ja nur Textersetzung und man keine Formatspezifizierer wenn man ohne Macro auch keine brauchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2484305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484305</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Fri, 22 Jan 2016 13:06:26 GMT</pubDate></item><item><title><![CDATA[Reply to TRACE Makro ohne footprint im Release on Fri, 22 Jan 2016 13:16:25 GMT]]></title><description><![CDATA[<p>Hab da wohl wirklich was falsch verstanden. Die Beispiele, dich gefunden habe, haben immer sowas wie <code>printf</code> nachgebaut und da hab ich wohl was nicht richtig verstanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2484307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2484307</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 22 Jan 2016 13:16:25 GMT</pubDate></item></channel></rss>