<?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[Auf der Suche nach einem Präprozessor-Trick...]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein kleines, kniffliges Problem. Ich habe mir einen kleinen Function-Guard gebastelt damit ich Stack-Traces, etc. auch zur Laufzeit bekomme, ohne Debugger oder Libs. Über Sinn und Zweck scheiden sich hier bekanntlich die Gemüter. Jedenfalls zum Problem; ich habe folgende Makros (vereinfacht):</p>
<pre><code>#define GUARD try { \
   StackMark guardStackMark(__FILE__, __LINE__, __FUNCTION__)

#define UNGUARD \
   } \
   catch ...

// Beispieleinsatz
void foobar()
{
   GUARD;

   ... code ...

   UNGUARD;
}
</code></pre>
<p>Knackpunkt ist, dass sobald ich 2 GUARD/UNGUARDs in einer Funktion habe bekomme ich eine shadowed/doppelt definierte Variable. Ich habe schon über oeStackMark##__LINE__ nachgedacht. Leider macht mir hier der Compiler einen Strich durch die Rechnung. Hat einer einen kreativen Einfall außer die Nutzung eines solchen Makros einzustellen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüße,<br />
Christoph</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/123930/auf-der-suche-nach-einem-präprozessor-trick</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 18:31:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/123930.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Oct 2005 13:15:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 13:15:50 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe ein kleines, kniffliges Problem. Ich habe mir einen kleinen Function-Guard gebastelt damit ich Stack-Traces, etc. auch zur Laufzeit bekomme, ohne Debugger oder Libs. Über Sinn und Zweck scheiden sich hier bekanntlich die Gemüter. Jedenfalls zum Problem; ich habe folgende Makros (vereinfacht):</p>
<pre><code>#define GUARD try { \
   StackMark guardStackMark(__FILE__, __LINE__, __FUNCTION__)

#define UNGUARD \
   } \
   catch ...

// Beispieleinsatz
void foobar()
{
   GUARD;

   ... code ...

   UNGUARD;
}
</code></pre>
<p>Knackpunkt ist, dass sobald ich 2 GUARD/UNGUARDs in einer Funktion habe bekomme ich eine shadowed/doppelt definierte Variable. Ich habe schon über oeStackMark##__LINE__ nachgedacht. Leider macht mir hier der Compiler einen Strich durch die Rechnung. Hat einer einen kreativen Einfall außer die Nutzung eines solchen Makros einzustellen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Grüße,<br />
Christoph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897779</guid><dc:creator><![CDATA[yellowsheep]]></dc:creator><pubDate>Fri, 21 Oct 2005 13:15:50 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 13:23:06 GMT]]></title><description><![CDATA[<p>hilft #undef ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897786</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Fri, 21 Oct 2005 13:23:06 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 13:25:02 GMT]]></title><description><![CDATA[<p>Der Ansatz oeStackMark##__LINE__ ist schon der richtige Weg, nur wenn du das direkt so schreibst, verkettet der Präprozessor erst und sucht dann nach neuen Ersetzungen. Da benötigst du eine Zwischenstufe:</p>
<pre><code class="language-cpp">#define CONCAT(a,b) a##b
#define GUARD try {\
  StackMark CONCAT(guard,__LINE__)(__FILE__,__LINE__,__FUNCTION__)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/897790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897790</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 21 Oct 2005 13:25:02 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 13:26:29 GMT]]></title><description><![CDATA[<p>Die Frage ist aber: Wofür sollte man das 2 mal oder öfter in einer Funktion brauchen?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897793</guid><dc:creator><![CDATA[hmmmmmmmmmmm]]></dc:creator><pubDate>Fri, 21 Oct 2005 13:26:29 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 13:51:40 GMT]]></title><description><![CDATA[<p>Pellaeon: Nein #undef kann da nicht helfen. Da der Präprozessor zustandlos ist und auch nur einen pass macht, d.h. man kein Makro in einem Makro definieren kann lassen sich auch keine Schleifen erzeugen.</p>
<p>hmmmmmmmmmmm: Die Frage nach dem Sinn ist ja immer relativ. Mein kleines &quot;ich&quot; in mir sagt mir, dass ich sowas brauch. Wenn es deins nicht tut, so hoffe ich, dass dein &quot;ich&quot; tollerant genug ist um mein Streben nach einer Lösung zu ertragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>CStoll: Ich bin mir nicht sicher ob er Fehler bei mir liegt. Deine Variante führt zu CONCAT(guardStackMark, __LINE): &quot;guardStackMark__LINE__&quot;, was exakt das gleiche wie guardStackMark##__LINE__ ist, leider. Ich fürchte fast, dass __LINE__ der Compiler und nicht der Präprozessor auflöst. Wenn du GCC, wie ich benutzt, kannst du dir den Compiler-Output mal per &quot;-save-temps&quot; anzeigen lassen. Das ist echt knifflig <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>
<p>Grüße,<br />
Christoph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897816</guid><dc:creator><![CDATA[yellowsheep]]></dc:creator><pubDate>Fri, 21 Oct 2005 13:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 13:59:43 GMT]]></title><description><![CDATA[<p>Nein, ich arbeite mit Visual Studio <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> *geht nachdenken*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897828</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 21 Oct 2005 13:59:43 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 14:15:56 GMT]]></title><description><![CDATA[<p>Ok man kann sich mal dick irren. Die 51 war mal __LINE__.</p>
<pre><code>#define OE_GUARD_CONCAT(a, b) a##b

#define OE_GUARD \
	try { \
	::OE::Core::StackMark OE_GUARD_CONCAT(__LINE__,guardStackMark)( \
							__FILE__, __LINE__, __FUNCTION__)

try { ::OE::Core::StackMark __LINE__guardStackMark( &quot;Main/Src/Regressiontest/Tests/OECoreExceptionTest.h&quot;, 51, __FUNCTION__);
</code></pre>
<p>Sehr doof, dass er es nicht auflöst.</p>
<p>Grüße,<br />
Christoph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897855</guid><dc:creator><![CDATA[yellowsheep]]></dc:creator><pubDate>Fri, 21 Oct 2005 14:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 14:16:45 GMT]]></title><description><![CDATA[<p>yellowsheep schrieb:</p>
<blockquote>
<p>Die Frage nach dem Sinn ist ja immer relativ. Mein kleines &quot;ich&quot; in mir sagt mir, dass ich sowas brauch. Wenn es deins nicht tut, so hoffe ich, dass dein &quot;ich&quot; tollerant genug ist um mein Streben nach einer Lösung zu ertragen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Das ist ja mal eine recht diplomatische Formulierung. Sieht man nicht sehr oft auf diesem Forum. <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="👍"
    /></p>
<p>yellowsheep schrieb:</p>
<blockquote>
<p>CStoll: Ich bin mir nicht sicher ob er Fehler bei mir liegt. Deine Variante führt zu CONCAT(guardStackMark, __LINE): &quot;guardStackMark__LINE__&quot;, was exakt das gleiche wie guardStackMark##__LINE__ ist, leider. Ich fürchte fast, dass __LINE__ der Compiler und nicht der Präprozessor auflöst. Wenn du GCC, wie ich benutzt, kannst du dir den Compiler-Output mal per &quot;-save-temps&quot; anzeigen lassen. Das ist echt knifflig <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>
<p>Grüße,<br />
Christoph</p>
</blockquote>
<p>Der Preprocessor werkelt wie folgt:</p>
<ul>
<li>1. Erweiteren der Funktionsmarkos im Source code (Tokenpasting mit ## gehört hierzu).</li>
<li>2. Erweiteren der Ersetzungsmakros im jetztigen Source code</li>
<li>3. Fals etwas ersetzt wurde springe zu 1. zurück.</li>
</ul>
<p>Dieses Model ist stark vereinfacht. Zum Beispiel passt die Tatsache, dass ein Makro nur über einen gewissen Teil des Quelltextes definiert ist nicht in dieses Model. Das gleiche Problem ist die Tatsache, dass Makros leider nicht recursive ersetzt werden können. Für unser Problem reicht es aber.</p>
<p>Dies heißt bei</p>
<pre><code class="language-cpp">#define CONCAT(a,b) a##b
#define GUARD try {\
  StackMark CONCAT(guard,__LINE__)(__FILE__,__LINE__,__FUNCTION__)
</code></pre>
<p>Macht er folgendes</p>
<pre><code class="language-cpp">GUARD
</code></pre>
<pre><code class="language-cpp">try {\
  StackMark CONCAT(guard,__LINE__)(__FILE__,__LINE__,__FUNCTION__)
</code></pre>
<pre><code class="language-cpp">try {\
  StackMark guard__LINE__(__FILE__,__LINE__,__FUNCTION__)
</code></pre>
<p>Wenn du jetzt aber das Makro wie folgt definiert hättest</p>
<pre><code class="language-cpp">#define GUARD_REAL(line) try {\
  StackMark guard ## line(__FILE__,__LINE__,__FUNCTION__)
#define GUARD_EXPAND(line) GUARD_REAL(line) // Hiermit wird Etappe 2 zwischengeschoben
#define GUARD GUARD_EXPAND(__LINE__)
</code></pre>
<p>Dann würde es deine Erwachtungen erfüllen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897856</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Fri, 21 Oct 2005 14:16:45 GMT</pubDate></item><item><title><![CDATA[Reply to Auf der Suche nach einem Präprozessor-Trick... on Fri, 21 Oct 2005 14:39:44 GMT]]></title><description><![CDATA[<p>Ben04, deine Lösung ist absolut korrekt und faszinierend zugleich! <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>
<p>Vielen Dank!</p>
<p>Grüße,<br />
Christoph</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897874</guid><dc:creator><![CDATA[yellowsheep]]></dc:creator><pubDate>Fri, 21 Oct 2005 14:39:44 GMT</pubDate></item></channel></rss>