<?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[Verständnisprobleme mit __VA_ARGS__]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Ich versuche gerade Makros mit einer variablen Anzahl von Parametern zu erstellen. Im Internet bin ich unter anderem auf folgende Lösung gestoßen, die auch funktioniert:</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

#define XXX_X(x,A,B,FUNC, ...)  	FUNC
#define XXX(...)                    XXX_X(,##__VA_ARGS__,\
                                          XXX_2(__VA_ARGS__),\
                                          XXX_1(__VA_ARGS__),\
                                          XXX_0(__VA_ARGS__)\
                                         )

#define XXX_0()                     cout &lt;&lt; &quot;no Arg&quot; &lt;&lt; endl;
#define XXX_1(A)                   	cout &lt;&lt; &quot;Arg 1: &quot; &lt;&lt; A &lt;&lt; endl;
#define XXX_2(A,B)                 	cout &lt;&lt; &quot;Arg 1: &quot; &lt;&lt; A &lt;&lt;  &quot;  Arg 2: &quot; &lt;&lt; B &lt;&lt; endl;

int main ()
{
	XXX();
	XXX(1);
	XXX(4, 6);

	return 0;
}
</code></pre>
<p>'__VA_ARGS__' fasst, so wie ich es verstanden habe, alle Argumente zusammen. Allerdings kann ich die Auflösung des Makros (bzw. der Makrokette) nicht nachvollziehen. Rufe ich z.B. folgende Zeile auf:</p>
<pre><code>XXX(1);
</code></pre>
<p>so würde ich es wie folgt ersetzen:</p>
<pre><code>XXX_X(,1, XXX_2(1),XXX_1(1), XXX_0(1))
</code></pre>
<p>Hier bin ich mir schon nicht sicher, warum das Makro 'XXX_X' mit ',##' beginnt. Ohne funktioniert es jedenfalls nicht mehr. Außerdem bin ich mir auch nicht sicher, wie das Makro weiter aufgelößt wird, so dass dann 'XXX_1(A)' angewendet wird. Auch Zeile '#define XXX_X(x,A,B,FUNC, ...) FUNC' verstehe ich nicht so ganz. <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>
<p>Kann mir jemand einen Tipp geben, wie das aufgelöst wird? Ich möchte ja schon gerne verstehen.</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/335830/verständnisprobleme-mit-__va_args__</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Apr 2026 03:50:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/335830.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Dec 2015 14:36:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Mon, 14 Dec 2015 14:36:57 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>Ich versuche gerade Makros mit einer variablen Anzahl von Parametern zu erstellen. Im Internet bin ich unter anderem auf folgende Lösung gestoßen, die auch funktioniert:</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

#define XXX_X(x,A,B,FUNC, ...)  	FUNC
#define XXX(...)                    XXX_X(,##__VA_ARGS__,\
                                          XXX_2(__VA_ARGS__),\
                                          XXX_1(__VA_ARGS__),\
                                          XXX_0(__VA_ARGS__)\
                                         )

#define XXX_0()                     cout &lt;&lt; &quot;no Arg&quot; &lt;&lt; endl;
#define XXX_1(A)                   	cout &lt;&lt; &quot;Arg 1: &quot; &lt;&lt; A &lt;&lt; endl;
#define XXX_2(A,B)                 	cout &lt;&lt; &quot;Arg 1: &quot; &lt;&lt; A &lt;&lt;  &quot;  Arg 2: &quot; &lt;&lt; B &lt;&lt; endl;

int main ()
{
	XXX();
	XXX(1);
	XXX(4, 6);

	return 0;
}
</code></pre>
<p>'__VA_ARGS__' fasst, so wie ich es verstanden habe, alle Argumente zusammen. Allerdings kann ich die Auflösung des Makros (bzw. der Makrokette) nicht nachvollziehen. Rufe ich z.B. folgende Zeile auf:</p>
<pre><code>XXX(1);
</code></pre>
<p>so würde ich es wie folgt ersetzen:</p>
<pre><code>XXX_X(,1, XXX_2(1),XXX_1(1), XXX_0(1))
</code></pre>
<p>Hier bin ich mir schon nicht sicher, warum das Makro 'XXX_X' mit ',##' beginnt. Ohne funktioniert es jedenfalls nicht mehr. Außerdem bin ich mir auch nicht sicher, wie das Makro weiter aufgelößt wird, so dass dann 'XXX_1(A)' angewendet wird. Auch Zeile '#define XXX_X(x,A,B,FUNC, ...) FUNC' verstehe ich nicht so ganz. <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>
<p>Kann mir jemand einen Tipp geben, wie das aufgelöst wird? Ich möchte ja schon gerne verstehen.</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479477</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Mon, 14 Dec 2015 14:36:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Mon, 14 Dec 2015 15:13:31 GMT]]></title><description><![CDATA[<p>Sag uns bitte, was Du machen willst und wir sagen Dir, was besser ist als Makros mit variablen Argumenten.</p>
<p>Und kann das mal jemand nach C++ verschieben? Schankedön.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479481</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 14 Dec 2015 15:13:31 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Mon, 14 Dec 2015 15:31:19 GMT]]></title><description><![CDATA[<p>ich möchte gerne 2 Makros umsetzen. Vereinfachtes Beispiel:</p>
<pre><code>#define RETURN_IF_FAILED(func)					\
{												\
	func;										\
	if (getStatuscode() != NO_ERROR)			\
	{											\
		return -1;								\
	}											\
}

#define RETURN_IF_FAILED(func, returnValue)		\
{												\
	func;										\
	if (getStatuscode() != NO_ERROR)			\
	{											\
		return returnValue;						\
	}											\
}
</code></pre>
<p>Ich möchte also ein Makro 'RETURN_IF_FAILED' nutzen, den ich einen optionalen Rückgabewert geben kann:</p>
<pre><code>RETURN_IF_FAILED(meineBeispielFunktion());
RETURN_IF_FAILED(meineBeispielFunktion(), MeinRückgabewertBeiFehler);
</code></pre>
<p>Gruß,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479485</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Mon, 14 Dec 2015 15:31:19 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Mon, 14 Dec 2015 21:04:53 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/u109509" rel="nofollow">SeppJ</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/f10" rel="nofollow">C (alle ISO-Standards)</a> in das Forum <a href="http://www.c-plusplus.net/forum/f15" rel="nofollow">C++ (alle ISO-Standards)</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/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/2479544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479544</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Mon, 14 Dec 2015 21:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Mon, 14 Dec 2015 21:08:30 GMT]]></title><description><![CDATA[<p>Gibt es einen tieferen Grund, nicht die bewährten Fehlerbehandlungspraktiken zu benutzen? Wenn das C++ sein soll (wonach es trotz der Forenwahl aussieht), böten sich ein paar Exceptions an. Einfacherer Code, übersichtlicherer Code, (in der Regel) keine Laufzeitkosten, und vor allem keine Makros!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479545</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 14 Dec 2015 21:08:30 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Mon, 14 Dec 2015 21:25:25 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>Ich möchte also ein Makro 'RETURN_IF_FAILED' nutzen, [...]</p>
</blockquote>
<p>Nein. Möchtest Du nicht!<br />
Du möchtest ein Problem lösen.<br />
Offensichtlich mit C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479551</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 14 Dec 2015 21:25:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Mon, 14 Dec 2015 22:07:41 GMT]]></title><description><![CDATA[<p>Mit den Makros möchte ich neben einer einfachen Fehlerbehandlung auch eine Log-Funktion integrieren. Natürlich geht es auch ohne Makros, aber das würde den Quellcode weiter aufblähen. Mit Exceptions habe ich aufgrund fehlender Erfahrung bisher noch nicht gearbeitet.</p>
<p>Makros wie 'RETURN_IF_FAILED' kenne ich noch aus Frameworks, mit denen ich mal kurzfristig zu tun hatte. Daher wollte ich so etwas auch in meinem Code zur Verfügung stellen. Nur weiß ich nicht, wie ich optionale Parameter realisiere. Der Code im 1. Post funktioniert z.B. unter g++ problemlos, aber nicht unter vc++. <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>
<p>Wie könnte man das Problem in meinen 2. Post am besten angehen. Wären hier das arbeiten mit Exceptions besser?</p>
<p>Edit: wie ich gerade sehe, finden Makros hier nicht viele Freunde. Sind Makros wirklich so schlimm? <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>
<p>Edit 2: Ja exceptions sehen schon mal sehr interessant aus und werde ich morgen in meinen Quellcode integrieren. Danke für den Tipp. Allerdings ist es für eine lokale Fehlerbehandlung in den einzelnen Funktionen ggf. nicht ideal. ...bin mir da nicht sicher.</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479552</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Mon, 14 Dec 2015 22:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Tue, 15 Dec 2015 00:38:44 GMT]]></title><description><![CDATA[<p>Es wäre besser, wenn du genau beschreibst, was du erreichen möchtest, anstatt nach Details zu deiner Lösungsidee zu fragen. &quot;Logger&quot; ist schon einmal ein gutes Stichwort. Da ist es zumindest vorstellbar, dass Makros eine passende Lösung sein <em>könnten</em>. Aber Fehlerbehandlung via globaler Fehlerflags? Das sind Techniken, die vor 20 Jahren schon veraltet waren. Wenn wir wirklich wollten, könnten wir dir sicherlich tolle Makros dafür schreiben, aber dir wäre sicherlich besser geholfen, wenn wir dir zeigen, wie du deine Fehler korrekt behandelst. Hier ist ein Artikel über Fehlerbehandlung in C++:<br />
<a href="https://www.c-plusplus.net/forum/219864">https://www.c-plusplus.net/forum/219864</a><br />
<a href="https://www.c-plusplus.net/forum/219865">https://www.c-plusplus.net/forum/219865</a><br />
Der Artikel ist vermutlich etwas zu anspruchsvoll, falls du noch nie mit modernem Softwaredesign Kontakt hattest und C++ nicht wirklich gut beherrscht (und C++ mit C verwechselst). Wenn du uns deine konkrete Problemstellung beschreibst, dann kann man dies hier auch sicherlich am konkreten Beispiel durchexerzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479559</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 15 Dec 2015 00:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Tue, 15 Dec 2015 11:04:06 GMT]]></title><description><![CDATA[<p>Danke für eure Geduld mit mir. <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="🙂"
    /><br />
Ja ich gebe dir Recht. Tatsächlich habe ich bisher Fehlerflags verwendet, da ich es noch von anderen Programmiersprachen (AutoIt, PureBasic, C) gewohnt war. Ich hatte schon die Vermutung, dass es in OOP-Programmiersprachen bessere Lösungen gibt. Da mir zudem die Erfahrung fehlt, weiß ich oft nicht welche Lösungen für welche Probleme am besten geeignet sind. Auch ist mir bewusst, dass ich derzeitig C und C++ gewisserweise mische.</p>
<p>Momentan setze ich für meine Masterarbeit ein Protokoll zur sicheren Zeitübertragung um. Habe mich daher für C++ entschieden, um dahingehend auch Wissen anzusammeln. Für die Entwicklung nutze ich drei externe Bibliotheken, für die ich Wrapper schreibe, um diese besser nutzen zu können.</p>
<p>hier mal ein Ausschnitt aus einer Klasse:</p>
<pre><code>int Asn1Wrapper::setAny(ANY_t &amp;destination, const unsigned char &amp;source, int num)
{
	// check parameters
	if (num &lt;= 0)
	{
		setStatuscode(NTS_ERR__INVALID_PARAMETER);
		return RETURN_ERROR;
	}

	// delete existing content
	clearAny(destination);

	// allocate and zero-initialize memory
	destination.buf = (unsigned char*)calloc(1, num);

	// check memory
	if (destination.buf == NULL)
	{
		setStatuscode(NTS_ERR__NO_MEMORY);
		return RETURN_ERROR;
	}

	// save new values
	memcpy(destination.buf, &amp;source, num);
	destination.size = num;

	// return success
	setStatuscode(NTS_ERR__NO_ERROR);
	return RETURN_NO_ERROR;
}
</code></pre>
<p>Vorweg: calloc() benutze ich hier bewusst, da die Lib in C geschrieben ist und gelegentlich einen realloc() anwendet. Ich denke das Mischen von new und realloc ist keine gute Idee. Was man hier auch gut sieht, ist dass ich mit Fehlerflags nicht sparsam bin. Der Grundgedanke ist erstmal, dass ich später jeden Fehler loggen kann. Nun war meine Überlegung, wie ich das ganze Verkürzen kann, da ich ja vor jedem return einen Statuscode setze. Meine Lösung war erstmal Makros. Ich habe mich da unter anderem an einem Framework und OpenSSL orientiert, da ich einfach nichts besseres gefunden habe und wissen wollte, wie größere Softwareprojekte mit Fehlerbehandlung umgehen. Nach dem einsetzen der Makros ändert sich mein Code wie folgt:</p>
<pre><code>int Asn1Wrapper::setAny(ANY_t &amp;destination, const unsigned char &amp;source, int num)
{
	// check parameters
	if (num &lt;= 0)
	{
		RETURN_ERROR(NTS_ERR__INVALID_PARAMETER);
	}

	// delete existing content
	RETURN_IF_FAILED(clearAny(destination));

	// allocate and zero-initialize memory
	destination.buf = (unsigned char*)calloc(1, num);

	// check memory
	RETURN_IF_POINTER_NULL(destination.buf, NTS_ERR__NO_MEMORY);

	// save new values
	memcpy(destination.buf, &amp;source, num);
	destination.size = num;

	// return success
	RETURN_SUCCESS;
}
</code></pre>
<p>Hinter dem Makro RETURN_IF_FAILED verbirgt sich folgendes:</p>
<pre><code>#define RETURN_IF_FAILED(func)				\
{											\
	int statusCode = 0;						\
	registerFunc(#func, &quot;in&quot;); 				\
	func;									\
	statusCode = getStatuscode();			\
	registerFunc(#func, &quot;out&quot;, statusCode); \
	if (statusCode != NTS_ERR__NO_ERROR)	\
	{										\
		return -1;							\
	}										\
}
</code></pre>
<p>Kurze Erläuterung zur gedachten Funktionsweise:<br />
Meine Überlegung war, ob ich alle meine Funktionen mit diesen Makros ausstatte. Das Makro RETURN_IF_FAILED könnte ich nämlich leicht zum Loggen der Funktionen erweitern (so wie bereits im Code). Die Funktion 'registerFunc()' ist momentan noch leer. Diese registriert mit Hilfe des Makros RETURN_IF_FAILED den Aufruf und das Verlassen einer Funktion. Werden mehrere Funktionen kaskadiert aufgerufen, so lassen sich die Funktionsaufrufe verfolgen. In etwa so:</p>
<pre><code>call function_1
	call function_2
		call function_3
		exit function_3, exitcode
	exit function_2, exitcode
	call function_4
		call function_3
		exit function_3, exitcode
	exit function_4, exitcode
exit function_1, exitcode
</code></pre>
<p>...gut das würde ich dann als Baumansicht mit einem Log-Auswertungsprogramm darstellen. Beim Makro RETURN_IF_FAILED gibt es allerdings ein Problem, wenn ich einen benutzerdefinierten Rückgabewert anstatt '-1' senden möchte. Dafür müsste mein Makro sinngemäß so aussehen: RETURN_IF_FAILED(func, &lt;optionalReturnValue&gt;). ...gut auf die Verfolgung der Funktionsaufrufe kann ich eigentlich auch verzichten, aber die Fehler möchte ich schon gerne loggen.</p>
<p>...Möglicherweise ist mein Lösungsansatz nicht so prall. Ich bin mir auch nicht sicher, wie eine saubere Alternative aussehen könnte. Exception sind schon interessant, aber wahrscheinlich nicht für einfache Fehler wie ein ungültiger Parameter sinnvoll. ....ich hätte nicht gedacht, dass mir eine Fehlerbehandlung so viel Kopfzerbrechen bereiten kann <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>
<p>Was kann ich tun?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: nochmals danke für die Links. Hatte ich gestern bereits gelesen, wobei insbesondere der zweite Link mich noch zu sehr fordert.</p>
<p>viele Grüße,<br />
SBond.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479611</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Tue, 15 Dec 2015 11:04:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Tue, 15 Dec 2015 11:16:12 GMT]]></title><description><![CDATA[<p>Überleg Dir ein Objekt, das im Konstruktor call schreibt und im Destruktor exit. Denke, die Basis ist besser.<br />
Die kannste dann übrigens auch noch mit RETURN-Makros ansteuern. Aber sie kann überhaupt immer einschreiten, wenn Du aus Versehen oder wegebn throw in aufgerufenen Funktionen ohne RETURN-Makro aus Deiner Funktion rausgehst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479612</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 15 Dec 2015 11:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Tue, 15 Dec 2015 21:47:14 GMT]]></title><description><![CDATA[<p>Hallo Leute. Erstmal danke für eure Tipps. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Ich denke der richtige Weg ist in meinem Fall die C++ error exception. So nimmt die eingangs gestellte Frage ein ganz anderes Ende. Abschließend hätte ich noch eine kleine Frage, die sich mir noch nicht beantwortet hat: Wenn ich in ein einem try{}-Block z.B. eine Funktion aufrufe die einen throw wirft, wie kann ich im catch{}-Block herausfinden, ob ich eventuell noch dynamischen Speicher freigeben muss, die in irgendeiner kaskadierten Subfunktion mal alloziert wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479688</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Tue, 15 Dec 2015 21:47:14 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisprobleme mit __VA_ARGS__ on Tue, 15 Dec 2015 22:03:07 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>Wenn ich in ein einem try{}-Block z.B. eine Funktion aufrufe die einen throw wirft, wie kann ich im catch{}-Block herausfinden, ob ich eventuell noch dynamischen Speicher freigeben muss, die in irgendeiner kaskadierten Subfunktion mal alloziert wurde?</p>
</blockquote>
<p>Gar nicht.<br />
Versuch es, wie Volkard vorschlägt. Stichwort ist: <a href="https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization" rel="nofollow">RAII.</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2479689</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2479689</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Tue, 15 Dec 2015 22:03:07 GMT</pubDate></item></channel></rss>