<?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[Wertermittlung beim Compilevorgang]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verwende ein Makro zum Loggen</p>
<pre><code class="language-cpp">#define LOG_INF(lvl, logEvent)         \
 {std::ostrstream ostrm;\
            ostrm &lt;&lt; logEvent &lt;&lt; std::ends;                                 \
			Logger::Write(lvl,ostrm.str());}
</code></pre>
<p>jetzt würde ich gern schon beim programmstart ausgeben welches der höchste verwendete lvl ist. Wie kann ich das realisieren ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/246609/wertermittlung-beim-compilevorgang</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 00:20:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246609.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Jul 2009 12:15:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 12:15:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verwende ein Makro zum Loggen</p>
<pre><code class="language-cpp">#define LOG_INF(lvl, logEvent)         \
 {std::ostrstream ostrm;\
            ostrm &lt;&lt; logEvent &lt;&lt; std::ends;                                 \
			Logger::Write(lvl,ostrm.str());}
</code></pre>
<p>jetzt würde ich gern schon beim programmstart ausgeben welches der höchste verwendete lvl ist. Wie kann ich das realisieren ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752268</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 12:15:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 12:21:14 GMT]]></title><description><![CDATA[<p>Du verwendest ein zweites Makro, z.B. LOG_LEVEL und verwendest dieses in LOG_INF und der Ausgabe beim Start.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752274</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 30 Jul 2009 12:21:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 12:57:41 GMT]]></title><description><![CDATA[<p>Das verstehe ich leider nicht. Könntest du ein Beispiel geben bitte ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752328</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 12:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 13:13:44 GMT]]></title><description><![CDATA[<p>1. Wieso verwendest du ein Makro, statt eines Funktiontemplates?<br />
2. Kannst du deine Frage ein wenig genauer erläutern? Welche höchste Verwendung? Die in deinem Programm? Wie soll das gehen?</p>
<pre><code class="language-cpp">int main()
{
  int x = 0;
  std::cin &gt;&gt; x;

  if(x &gt; 0)
  {
    LOG_INF(10, &quot;bla&quot;);
  }
  else
  {
    LOG_INF(0, &quot;blu&quot;);
  }

  return 0;
}
</code></pre>
<p>Was ist nun der höchste verwendete Level? 10? Was ist wenn der User eine negative Zahl eingibt? Und wozu willst du sowas überhaupt wissen, bzw. ist es wirklich das, was du wissen willst?</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752355</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:13:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 13:15:04 GMT]]></title><description><![CDATA[<p>ich habe jetzt folgendes:</p>
<pre><code class="language-cpp">static int xx;
#define CNT(c) \
	if (c&gt;xx) xx=c;
</code></pre>
<p>diese Lösung findet das Maximum der <strong>bisher</strong> (bis zum Punkt der Ausgabe) verwendeten Loglevel.</p>
<p>Ich möchte aber gern den <em>insgesamt im Projekt maximalen</em> Loglevel wissen wollen. Ist das möglich ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752356</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:15:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 13:17:05 GMT]]></title><description><![CDATA[<p>Entschuldige, ich hatte dich beim ersten Lesen falsch verstanden: Nein, das geht allgemein so nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752358</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:17:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 13:23:43 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>1. Wieso verwendest du ein Makro, statt eines Funktiontemplates?<br />
2. Kannst du deine Frage ein wenig genauer erläutern? Welche höchste Verwendung? Die in deinem Programm? Wie soll das gehen?</p>
<pre><code class="language-cpp">int main()
{
  int x = 0;
  std::cin &gt;&gt; x;

  if(x &gt; 0)
  {
    LOG_INF(10, &quot;bla&quot;);
  }
  else
  {
    LOG_INF(0, &quot;blu&quot;);
  }

  return 0;
}
</code></pre>
<p>Was ist nun der höchste verwendete Level? 10? Was ist wenn der User eine negative Zahl eingibt? Und wozu willst du sowas überhaupt wissen, bzw. ist es wirklich das, was du wissen willst?</p>
<p>Grüssli</p>
</blockquote>
<p>der Höchste Level ist 10.<br />
Das will ich wissen damit der Benutzer, falls er einen niedrigeren als den höchsten Loglevel eingestellt hat und in seinem Logfile nicht alles sieht, die Möglichkeit hat zu erfahren welchen Loglevel er maximal einstellen muss um alles zu sehen. Diese Information möchte ich als erstes in die logdatei schreiben. Der Logger soll aber möglichst auch in anderen Klassen verwendet werden so dass ich den maximalen Level nicht vorgeben möchte.</p>
<p>Der Logger loggt alles was unter einem eingestellten Logevel liegt.<br />
z.B. Level = 3<br />
Log(1,&quot;test1&quot;);<br />
Log(2,&quot;test2&quot;);<br />
Log(3,&quot;test3&quot;);<br />
Log(4,&quot;test4&quot;);</p>
<p>Ausgabe:<br />
test1<br />
test2</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752370</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 13:43:04 GMT]]></title><description><![CDATA[<p>EDIT:<br />
Sorry vergiss es. Das hier war schmarrn!</p>
<pre><code class="language-cpp">#define LOG_INF(lvl, logEvent)         \
 {std::ostrstream ostrm;\
            ostrm &lt;&lt; logEvent &lt;&lt; std::ends;   \
            #define MAX_lvl MAX(MAX_lvl, lvl);                    \
            Logger::Write(lvl,ostrm.str());}
</code></pre>
<p>Aber Makros werden inzwischen meist als böse betrachtet.<br />
MAX_lvl muss scope frei /global sein. Ebenfalls ein no-no.</p>
<p>Aber bei loggern, asserts und unit tests macht man öfter mal ne ausnahme...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752377</guid><dc:creator><![CDATA[krxlprnft]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:43:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 13:40:44 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19259">@krxlprnft</a>,<br />
Das bringt ein alter Hut, er will es vor dem Programmstart wissen, also quasi zur Kompilierzeit herausfinden. Das ist so gut wie unmöglich.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21944">@MBreuer</a>,<br />
Es ist so gut wie unmöglich und auch wenig sinnvoll. Setzte am besten selber ein paar Warnungstufen, mach daraus ein <code>enum</code> , mach aus dem Makro ein Funktionstemplate, füge ein assert ein. Also ca. so:</p>
<pre><code class="language-cpp">enum LogLevel
{
  LLVL_MESSAGE,
  LLVL_WARNING,
  LLVL_ERROR,
  LLVL_FATAL
};

template&lt;typename ObjectT&gt;
void logInfo(LogLevel lvl, ObjectT const&amp; obj)
{
  assert(lvl &lt;= LLVL_FATAL &amp;&amp; lvl &gt;= LLVL_MESSAGE);

  // ... restlicher Code ...
}

// Theoretisch könntest du sogar dies statisch zur Kompilezeit prüfen lassen:
template&lt;LogLevel LVL, typename ObjectT&gt;
void logInfo(ObjectT const&amp; obj)
{
  static_assert(LVL &gt;= LLVL_MESSAGE &amp;&amp; LVL &lt;= LLVL_FATAL);

  // ... restlicher Code ...
}

// Verwendung dann:
logInfo&lt;LogLevel::LLVL_ERROR&gt;(&quot;bliblablub&quot;);
</code></pre>
<p>Natürlich müsstest du eine <code>static_assert</code> Implementation haben oder selber erstellen. Boost bietet bereits eine an.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752383</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:40:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wertermittlung beim Compilevorgang on Thu, 30 Jul 2009 13:48:56 GMT]]></title><description><![CDATA[<p>Also wenn es unbedingt sein muss(Draveres Vorschlag ist VIEL besser), wirst du externe Programme bemühen müssen. Mit grep und awk ist das ein einzeiliges Shellscript. Das Problem ist halt, dass der Präprozessor</p>
<ol>
<li>Nicht rechnen kann</li>
<li>Keine Variablen kennt</li>
<li>Sich nichts über verschiedene Übersetzungseinheiten merken kann</li>
</ol>
<p>1 und 2 kann man mit viel Trickserei noch umgehen, aber spätestens Punkt 3 erzwingt eine externe Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1752391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1752391</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 30 Jul 2009 13:48:56 GMT</pubDate></item></channel></rss>