<?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[Makros mit unbekannter Anzahl an Parametern?]]></title><description><![CDATA[<p>Hallo *,</p>
<p>ich sitze grade an einem Projekt, welches viele Callback Funktionen für <a href="http://expat.sourceforge.net/" rel="nofollow">expat</a> enthält. Die Signatur sieht dabei immer so aus</p>
<pre><code class="language-cpp">void XMLCALL KlasseXY::xmlIrgendwast(void *userData, const char**atts)
</code></pre>
<p><em>userData</em>ist mit einer Datenstruktur belegt, um die gehts aber nicht.<br />
<em>atts</em> wird von expat wie folgt gefüllt:</p>
<ul>
<li>atts[i] enthält den Namen des Parameters im XML Stream</li>
<li>atts[i+1] den zugehörigen Wert</li>
</ul>
<p>Jetzt möchte ich mit diesen Daten natürlich etwas anfangen und könnte meine lokalen Variablen einfach mit</p>
<pre><code class="language-cpp">int i = atoi(atts[1]);
char* x = atts[3];
//usw.
</code></pre>
<p>zuweisen. Der Pferdefuß an der ganzen XML Geschichte ist aber natürlich, dass Parameter in beliebiger Reihenfolge stehen können; daher werden die Namen ja auch mit übergeben.</p>
<p>Nun habe ich mir folgendes Konstrukt geschrieben:</p>
<pre><code class="language-cpp">int a; 
	char* b = NULL;
	int i;
	for (i = 0; atts[i]!=NULL; i += 2) {
		if(strcmp(atts[i],&quot;Irgendwas&quot;)==0)
			a = atoi(atts[i+1]);
		else 
		if(strcmp(atts[i],&quot;Irgendwas Anderes&quot;)==0)
			b = atts[i+1];
		else std::cout &lt;&lt; &quot;Warning: unknown tag &quot; &lt;&lt; atts[i] &lt;&lt; &quot; = &quot; &lt;&lt; atts[i+1] &lt;&lt; &quot; encounterd at line &quot; 
&lt;&lt; XML_GetCurrentLineNumber(*PointeraufXMLParser) &lt;&lt; std::endl;
	}
</code></pre>
<p>Wenn ich das jetzt für mehr Parameter mache, müllt das den ganzen Code zu. Meine Idee war jetzt, mir ein Makro zu schreiben, dem ich immer Paare aus char* für den Namen und eine void Referenz für den Wert übergebe.<br />
Ich habe zwar schon mit Funktionen mit variablen Argumenten Listen gearbeitet, bin aber nicht so fit in Makros.</p>
<p>Könnte mir jemand auf die Sprünge helfen, bitte? <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/142294/makros-mit-unbekannter-anzahl-an-parametern</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 20:18:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/142294.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Mar 2006 10:25:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Makros mit unbekannter Anzahl an Parametern? on Wed, 29 Mar 2006 10:31:02 GMT]]></title><description><![CDATA[<p>Hallo *,</p>
<p>ich sitze grade an einem Projekt, welches viele Callback Funktionen für <a href="http://expat.sourceforge.net/" rel="nofollow">expat</a> enthält. Die Signatur sieht dabei immer so aus</p>
<pre><code class="language-cpp">void XMLCALL KlasseXY::xmlIrgendwast(void *userData, const char**atts)
</code></pre>
<p><em>userData</em>ist mit einer Datenstruktur belegt, um die gehts aber nicht.<br />
<em>atts</em> wird von expat wie folgt gefüllt:</p>
<ul>
<li>atts[i] enthält den Namen des Parameters im XML Stream</li>
<li>atts[i+1] den zugehörigen Wert</li>
</ul>
<p>Jetzt möchte ich mit diesen Daten natürlich etwas anfangen und könnte meine lokalen Variablen einfach mit</p>
<pre><code class="language-cpp">int i = atoi(atts[1]);
char* x = atts[3];
//usw.
</code></pre>
<p>zuweisen. Der Pferdefuß an der ganzen XML Geschichte ist aber natürlich, dass Parameter in beliebiger Reihenfolge stehen können; daher werden die Namen ja auch mit übergeben.</p>
<p>Nun habe ich mir folgendes Konstrukt geschrieben:</p>
<pre><code class="language-cpp">int a; 
	char* b = NULL;
	int i;
	for (i = 0; atts[i]!=NULL; i += 2) {
		if(strcmp(atts[i],&quot;Irgendwas&quot;)==0)
			a = atoi(atts[i+1]);
		else 
		if(strcmp(atts[i],&quot;Irgendwas Anderes&quot;)==0)
			b = atts[i+1];
		else std::cout &lt;&lt; &quot;Warning: unknown tag &quot; &lt;&lt; atts[i] &lt;&lt; &quot; = &quot; &lt;&lt; atts[i+1] &lt;&lt; &quot; encounterd at line &quot; 
&lt;&lt; XML_GetCurrentLineNumber(*PointeraufXMLParser) &lt;&lt; std::endl;
	}
</code></pre>
<p>Wenn ich das jetzt für mehr Parameter mache, müllt das den ganzen Code zu. Meine Idee war jetzt, mir ein Makro zu schreiben, dem ich immer Paare aus char* für den Namen und eine void Referenz für den Wert übergebe.<br />
Ich habe zwar schon mit Funktionen mit variablen Argumenten Listen gearbeitet, bin aber nicht so fit in Makros.</p>
<p>Könnte mir jemand auf die Sprünge helfen, bitte? <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/1026293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1026293</guid><dc:creator><![CDATA[MrBigglesworth]]></dc:creator><pubDate>Wed, 29 Mar 2006 10:31:02 GMT</pubDate></item><item><title><![CDATA[Reply to Makros mit unbekannter Anzahl an Parametern? on Wed, 29 Mar 2006 10:28:15 GMT]]></title><description><![CDATA[<p>Ich glaube das gehört in`s C++ Forum, hier ist ANSI C! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1026297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1026297</guid><dc:creator><![CDATA[strcat]]></dc:creator><pubDate>Wed, 29 Mar 2006 10:28:15 GMT</pubDate></item><item><title><![CDATA[Reply to Makros mit unbekannter Anzahl an Parametern? on Wed, 29 Mar 2006 10:30:22 GMT]]></title><description><![CDATA[<p>Oh sorry, mir war der Unterschied nie wirklich klar. Na ja, mag's ein Mod verschieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1026301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1026301</guid><dc:creator><![CDATA[MrBigglesworth]]></dc:creator><pubDate>Wed, 29 Mar 2006 10:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to Makros mit unbekannter Anzahl an Parametern? on Wed, 29 Mar 2006 14:25:21 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile.php?mode=viewprofile&amp;u=13512" rel="nofollow">c.rackwitz</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=10" rel="nofollow">ANSI C</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum.php?f=15" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic.php?t=39405" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1026554</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1026554</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 29 Mar 2006 14:25:21 GMT</pubDate></item><item><title><![CDATA[Reply to Makros mit unbekannter Anzahl an Parametern? on Wed, 29 Mar 2006 16:17:06 GMT]]></title><description><![CDATA[<p>C++ was?! Da muss ich dich leider enttäuschen, da gibt es sowas nicht.</p>
<pre><code>Variable-argument preprocessor function macros

C99 supports preprocessor function macros that may take a variable number of arguments. Such macros are defined with a trailing '...' token in their parameter lists, and may use the __VA_ARGS__ reserved identifier in their replacement text.

For example:

    #define DEBUGF(f,...) \
        (fprintf(dbgf, &quot;%s(): &quot;, f), fprintf(dbgf, __VA_ARGS__))

    #define DEBUGL(...) \
        fprintf(dbgf, __VA_ARGS__)

    int incr(int *a)
    {
        DEBUGF(&quot;incr&quot;, &quot;before: a=%d\n&quot;, *a);
        (*a)++;
        DEBUGL(&quot;after: a=%d\n&quot;, *a);
        return (*a);
    } 

C++ does not provide this feature.

(This feature is likely to be provided as an extension by many C++ compilers.)

[C99: §6.10.3, 6.10.3.1, 6.10.3.4, 6.10.3.5]
[C++98: §16.3, 16.3.1]
</code></pre>
<p><a href="http://david.tribble.com/text/cdiffs.htm" rel="nofollow">Das steht hier...</a>wie dort steht unterstützt das dein Compiler unter Umständen aber trotzdem. Du musst es halt ausprobieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1026651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1026651</guid><dc:creator><![CDATA[Gideon]]></dc:creator><pubDate>Wed, 29 Mar 2006 16:17:06 GMT</pubDate></item><item><title><![CDATA[Reply to Makros mit unbekannter Anzahl an Parametern? on Thu, 30 Mar 2006 11:37:40 GMT]]></title><description><![CDATA[<p>Ah vielen Dank, das brachte mich schonmal weiter. VS 2005 scheint das Makro jedenfalls zu unterstützen.</p>
<p>Aber wie immer stellt man hinterher fest, dass das gar nciht das ist, was man gesucht hatte; oder gibt es eine Möglichkeit die Argumente zu indizieren?<br />
Im obigen Beispiel brauche ich sie ja immer paarweise sowie den Typ - also Tripel.</p>
<p>Wahrscheinlich denk ich wieder viel zu kompliziert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1027051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1027051</guid><dc:creator><![CDATA[MrBigglesworth]]></dc:creator><pubDate>Thu, 30 Mar 2006 11:37:40 GMT</pubDate></item></channel></rss>