<?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[Makro-Frage bzgl. Logging]]></title><description><![CDATA[<p>Aaaalso, ich versuch's möglichst einfach zu halten.</p>
<p>Ich hab ein Logging-Makro &quot;Debug&quot;, das wird z.B. so benutzt</p>
<pre><code class="language-cpp">Debug((LP_Debug, &quot;Eine tolle Loggingausgabe&quot;));
</code></pre>
<p>Es wird zweimal geklammert, da Makros ja nur ein Ausdruck übergeben werden kann. An die entsprechende Stelle kopiert der Compiler dann folgendes:</p>
<pre><code class="language-cpp">#ifndef NDEBUG
    	#define Debug(x)								                 \
    	{													             \
    		CMessage *pMsg = new CMessage(__FILE__, __LINE__); \
    		pMsg-&gt;SetMsg x ;                                             \
    		CMessageHandler::Instance()-&gt;Log(pMsg);                 \
    		delete pMsg;                                                 \
    	}
    #else
    	#define Debug(x) {}
    #endif
</code></pre>
<p>D.h. es wird ein Objekt vom Typ CMessage angelegt und die Methode SetMsg wie folgt aufgerufen:</p>
<pre><code class="language-cpp">pMsg-&gt;SetMsg x ;  
=
pMsg-&gt;SetMsg(LP_Debug, &quot;Eine tolle Loggingausgabe&quot;);
</code></pre>
<p>Soweit, so gut. Jetzt kann man die Loggingausgaben komplett zur Compilezeit entfernen, wenn das define</p>
<pre><code class="language-cpp">#define NDEBUG
</code></pre>
<p>gesetzt wird, da in in diesem Fall von dem Compiler nur zwei geschweifte Klammern an die Stelle kopiert werden: {}.</p>
<p><strong>Jetzt die neue Anforderung</strong><br />
Es soll möglich sein alle Loggingtypen (LP_Debug,LP_Warning,LP_Critical,...) separat <strong>zur Compilezeit</strong> entfernen zu können.<br />
Bei dem Code so wie es jetzt ist muss ja immer erst die Message angelegt werden, damit ich später über eine Methode den Typen herausbekommen kann. Das wäre ja schon nach der Compilierung.</p>
<p>Seh ich das richtig, dass meine einzige Lösungsmöglichkeit darin besteht, mehrere Makros einzuführen, die man dann separat ausschalten kann?</p>
<p>Aus</p>
<pre><code class="language-cpp">Debug((LP_Debug, &quot;Eine tolle Loggingausgabe&quot;));
</code></pre>
<p>würde dann</p>
<pre><code class="language-cpp">LP_Debug((&quot;Eine tolle Loggingausgabe&quot;));
</code></pre>
<p>werden. Entsprechend für alle anderen Typen z.B.</p>
<pre><code class="language-cpp">LP_Warning((&quot;Eine tolle Warning-Ausgabe&quot;));
</code></pre>
<p>Oder habt ihr da eine andere Idee? Bzw. geht das in meinem Fall überhaupt anders <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219185/makro-frage-bzgl-logging</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:57:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219185.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Jul 2008 13:54:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Wed, 30 Jul 2008 13:54:46 GMT]]></title><description><![CDATA[<p>Aaaalso, ich versuch's möglichst einfach zu halten.</p>
<p>Ich hab ein Logging-Makro &quot;Debug&quot;, das wird z.B. so benutzt</p>
<pre><code class="language-cpp">Debug((LP_Debug, &quot;Eine tolle Loggingausgabe&quot;));
</code></pre>
<p>Es wird zweimal geklammert, da Makros ja nur ein Ausdruck übergeben werden kann. An die entsprechende Stelle kopiert der Compiler dann folgendes:</p>
<pre><code class="language-cpp">#ifndef NDEBUG
    	#define Debug(x)								                 \
    	{													             \
    		CMessage *pMsg = new CMessage(__FILE__, __LINE__); \
    		pMsg-&gt;SetMsg x ;                                             \
    		CMessageHandler::Instance()-&gt;Log(pMsg);                 \
    		delete pMsg;                                                 \
    	}
    #else
    	#define Debug(x) {}
    #endif
</code></pre>
<p>D.h. es wird ein Objekt vom Typ CMessage angelegt und die Methode SetMsg wie folgt aufgerufen:</p>
<pre><code class="language-cpp">pMsg-&gt;SetMsg x ;  
=
pMsg-&gt;SetMsg(LP_Debug, &quot;Eine tolle Loggingausgabe&quot;);
</code></pre>
<p>Soweit, so gut. Jetzt kann man die Loggingausgaben komplett zur Compilezeit entfernen, wenn das define</p>
<pre><code class="language-cpp">#define NDEBUG
</code></pre>
<p>gesetzt wird, da in in diesem Fall von dem Compiler nur zwei geschweifte Klammern an die Stelle kopiert werden: {}.</p>
<p><strong>Jetzt die neue Anforderung</strong><br />
Es soll möglich sein alle Loggingtypen (LP_Debug,LP_Warning,LP_Critical,...) separat <strong>zur Compilezeit</strong> entfernen zu können.<br />
Bei dem Code so wie es jetzt ist muss ja immer erst die Message angelegt werden, damit ich später über eine Methode den Typen herausbekommen kann. Das wäre ja schon nach der Compilierung.</p>
<p>Seh ich das richtig, dass meine einzige Lösungsmöglichkeit darin besteht, mehrere Makros einzuführen, die man dann separat ausschalten kann?</p>
<p>Aus</p>
<pre><code class="language-cpp">Debug((LP_Debug, &quot;Eine tolle Loggingausgabe&quot;));
</code></pre>
<p>würde dann</p>
<pre><code class="language-cpp">LP_Debug((&quot;Eine tolle Loggingausgabe&quot;));
</code></pre>
<p>werden. Entsprechend für alle anderen Typen z.B.</p>
<pre><code class="language-cpp">LP_Warning((&quot;Eine tolle Warning-Ausgabe&quot;));
</code></pre>
<p>Oder habt ihr da eine andere Idee? Bzw. geht das in meinem Fall überhaupt anders <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556430</guid><dc:creator><![CDATA[Logger5000]]></dc:creator><pubDate>Wed, 30 Jul 2008 13:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Wed, 30 Jul 2008 14:26:33 GMT]]></title><description><![CDATA[<p>Aus dem einen Doppelparameter einzelne machen und dann abfragen mit zB:</p>
<pre><code>#define DEBUG(TYP, TEXT)...

if (TYP == LP_DEBUG) usw.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1556448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556448</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Wed, 30 Jul 2008 14:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Wed, 30 Jul 2008 14:29:30 GMT]]></title><description><![CDATA[<p>Logger5000 schrieb:</p>
<blockquote>
<p>Es wird zweimal geklammert, da Makros ja nur ein Ausdruck übergeben werden kann.</p>
</blockquote>
<p>Aja? Das wäre mir neu ...</p>
<p>Ich würde das so machen:</p>
<pre><code class="language-cpp">#ifdef _DEBUG

  void debug_log(ErsterTyp erstesArgument, ZweiterTyp zweitesArgument)
  {
    CMessage Message(__FILE__, __LINE__);
    Message.SetMsg(erstesArgument, zweitesArgument);
    CMessageHandler::Instance()-&gt;Log(&amp;Message);
  }

  #define DEBUG_LOG(x, y) debug_log(x, y)

#else
  #define DEBUG_LOG(x, y)
#endif

// Verwendung:
DEBUG_LOG(LP_Debug, &quot;Hallo!&quot;);
</code></pre>
<p>Dein zweites Problem oder eigentliches Problem verstehe ich allerdings nicht. Vor allem was diesen Satz betrifft:</p>
<blockquote>
<p>Bei dem Code so wie es jetzt ist muss ja immer erst die Message angelegt werden, damit ich später über eine Methode den Typen herausbekommen kann. Das wäre ja schon nach der Compilierung.</p>
</blockquote>
<p>Willst du vielleicht das folgende?</p>
<pre><code class="language-cpp">#ifdef _DEBUG
  // wie oben, nur zusätzlich:
  #define DEBUG_WARNING(x) debug_log(LP_Warning, x)
#else
  #define DEBUG_LOG(x, y)
  #define DEBUG_WARNING(x)
#endif
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556449</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 30 Jul 2008 14:29:30 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Wed, 30 Jul 2008 14:34:06 GMT]]></title><description><![CDATA[<p>oder templates nehmen. erhöht aber die compile time, dafür kann man solche logging sachen feiner lösen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556458</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 30 Jul 2008 14:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Thu, 31 Jul 2008 07:15:38 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Dein zweites Problem oder eigentliches Problem verstehe ich allerdings nicht. Vor allem was diesen Satz betrifft:</p>
<blockquote>
<p>Bei dem Code so wie es jetzt ist muss ja immer erst die Message angelegt werden, damit ich später über eine Methode den Typen herausbekommen kann. Das wäre ja schon nach der Compilierung.</p>
</blockquote>
<p>Willst du vielleicht das folgende?</p>
<pre><code class="language-cpp">#ifdef _DEBUG
  // wie oben, nur zusätzlich:
  #define DEBUG_WARNING(x) debug_log(LP_Warning, x)
#else
  #define DEBUG_LOG(x, y)
  #define DEBUG_WARNING(x)
#endif
</code></pre>
<p>Grüssli</p>
</blockquote>
<p>Ja es geht in die richtige Richtung. Meine Frage bezieht sich auf das Überprüfung um welchen Typ der Nachricht es sich handelt.<br />
Bei deiner Lösung</p>
<pre><code class="language-cpp">#define DEBUG_LOG(x, y)
  #define DEBUG_WARNING(x)
</code></pre>
<p>würde die Fallunterscheidung ja wegfallen, weil der Benutzer explizit auswählt, was er haben will.</p>
<p>Tut er das nicht, so komm ich doch nicht darum herum, diese Fallunterscheidung mit &quot;richtigen&quot; if-Bedingungen zu machen.</p>
<p>Oder geht mit Makros irgendwie sowas:</p>
<pre><code class="language-cpp">#ifndef (NO_WARNINGS &amp;&amp; TYPE == LP_WARNING) /* Warningnachricht erstellen */
</code></pre>
<p>So das der Typ wirklich schon vom Compiler geprüft wird?<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556786</guid><dc:creator><![CDATA[Logger5000]]></dc:creator><pubDate>Thu, 31 Jul 2008 07:15:38 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Thu, 31 Jul 2008 07:33:33 GMT]]></title><description><![CDATA[<p>Nur mal so aus interesse:<br />
Kommt bei Draveres Vorschlag mit der Funktion für die Zeile <code>CMessage Message(__FILE__, __LINE__);</code> nicht immer die Zeilennummer in der <code>debug_log</code> FUnktion selbst raus? Eigentlich will man doch die Zeile haben, an der die Funktion aufgerufen wird, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556796</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 31 Jul 2008 07:33:33 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Thu, 31 Jul 2008 07:37:59 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Nur mal so aus interesse:<br />
Kommt bei Draveres Vorschlag mit der Funktion für die Zeile <code>CMessage Message(__FILE__, __LINE__);</code> nicht immer die Zeilennummer in der <code>debug_log</code> FUnktion selbst raus? Eigentlich will man doch die Zeile haben, an der die Funktion aufgerufen wird, oder?</p>
</blockquote>
<p>Jupp.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556801</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Thu, 31 Jul 2008 07:37:59 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Fri, 01 Aug 2008 05:22:39 GMT]]></title><description><![CDATA[<p>Okay, anders formuliert:</p>
<p>Kann ich den Typen der Nachricht vom Compiler überprüfen lassen mit irgendwie</p>
<p>#if TYPE==BLA</p>
<p>oder mussich das tatsächlich zur Laufzeit machen mit</p>
<p>if(TYPE===BLA)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557340</guid><dc:creator><![CDATA[Logger5000]]></dc:creator><pubDate>Fri, 01 Aug 2008 05:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Fri, 01 Aug 2008 09:14:37 GMT]]></title><description><![CDATA[<p>Ich würde nicht allzuviel Zeit darauf verschwenden eine &quot;if-freie&quot; Lösung zu suchen, bevor du die &quot;mit-if&quot; Lösung nicht ausprobiert hast.<br />
Eigentlich sollte der Compiler ein &quot;if(konstante == konstante)&quot; im Release-Build komplett eliminieren. Diese Optimierung ist so einfach dass das wohl sogar 10 Jahre alte Compiler wie VC6 hinbekommen sollten.</p>
<p>Auch durch Templates entsteht oft solcher Code, und um gute Performance mit den heute üblichen Template-Schlachten hinzubekommen müssen heutige Compiler solche Dinge auch gut optimieren können.</p>
<p>Und nochwas: diese if-s tun nicht wirklich SO weh, selbst wenn sie drinbleiben (weil der Vergleichswert z.B. eine Variable ist, damit man die zur Laufzeit umsetzen kann oder sowas). Der Vergleich fällt ja meist gleich aus &quot;nicht loggen&quot;, d.h. die Branch-Prediction kann das sehr gut handhaben.</p>
<p>In ganz engen Schleifen ist sowas natürlich böse, aber in 99% des Codes schätze ich mal ziemlich egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557447</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 01 Aug 2008 09:14:37 GMT</pubDate></item><item><title><![CDATA[Reply to Makro-Frage bzgl. Logging on Fri, 01 Aug 2008 09:48:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Logger5000 schrieb:</p>
<blockquote>
<p>Okay, anders formuliert:</p>
<p>Kann ich den Typen der Nachricht vom Compiler überprüfen lassen mit irgendwie</p>
<p>#if TYPE==BLA</p>
<p>oder mussich das tatsächlich zur Laufzeit machen mit</p>
<p>if(TYPE===BLA)</p>
</blockquote>
<p>habe mir jetzt nicht alles durchgelesen, aber so etwas:</p>
<pre><code class="language-cpp">#define LP_DEBUG 1
#define LP_WARNING 2
#define LP_CRITICAL 4

// enable warning and critical level
#define TYP (LP_WARNING | LP_CRITICAL)

#if TYP &amp; LP_WARNING
  // Code
#endif

#if TYP &amp; LP_DEBUG
  // Code
#endif

#if TYP &amp; LP_CRITICAL
  // Code
#endif
</code></pre>
<p>funktioniert z.B.</p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1557466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1557466</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Fri, 01 Aug 2008 09:48:30 GMT</pubDate></item></channel></rss>