<?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[Variable Parameterliste - seltsames Beispiel]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>ich grabe hier in einem Projekt herum, und in einer Klasse desselben fand ich folgenden, etwas seltsamen, Code:</p>
<pre><code class="language-cpp">HRESULT CSerializerSrv::CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...)
{
	UNUSED_ALWAYS(eVarType);
	va_list args;
	va_start(args, pszGUID);
	return CallMethod(pvObject, vtRet, pszMethodName, pszGUID, args);
}
</code></pre>
<p>Was mich irritiert ist der Aufruf von CallMethod IN CallMethod, und das fehlende va_end Makro, das wohl auch dort vorhanden sein sollte, oder?</p>
<p>Die zugehoerige Klassendefinition ist folgende:</p>
<pre><code class="language-cpp">class ISerializer : public IConfigurable
{
public:
	// !!!Important !!! The last argument must be VT_EMPTY, identifying vaarg list end
	/* ... */
	virtual HRESULT CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...) = 0;
	virtual HRESULT CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, va_list args) = 0;
	/* ... */
};

class CSerializerSrv :
	public ISerializer,
	public ILoggerCallback
{
public:
	/* .... */
	virtual HRESULT CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...);
	/* .... */
};
</code></pre>
<p>Kann mir jemand erklaeren, welche Methode jetzt mit dem Aufruf von CallMethod in der Methode CallMethod aufgerufen wird? Es sollte ja die der Basisklasse sein, oder? Leider ist diese gerade so virtuell genug, dass das so irgendwie nicht funktionieren kann ... . Und warum kann man das va_end einfach weglassen?</p>
<p>Gruesse, ein Frohes Neues Jahr und Danke schon mal,</p>
<p>Axel.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131264/variable-parameterliste-seltsames-beispiel</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 03:02:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131264.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Jan 2006 08:26:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variable Parameterliste - seltsames Beispiel on Mon, 02 Jan 2006 09:03:37 GMT]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>ich grabe hier in einem Projekt herum, und in einer Klasse desselben fand ich folgenden, etwas seltsamen, Code:</p>
<pre><code class="language-cpp">HRESULT CSerializerSrv::CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...)
{
	UNUSED_ALWAYS(eVarType);
	va_list args;
	va_start(args, pszGUID);
	return CallMethod(pvObject, vtRet, pszMethodName, pszGUID, args);
}
</code></pre>
<p>Was mich irritiert ist der Aufruf von CallMethod IN CallMethod, und das fehlende va_end Makro, das wohl auch dort vorhanden sein sollte, oder?</p>
<p>Die zugehoerige Klassendefinition ist folgende:</p>
<pre><code class="language-cpp">class ISerializer : public IConfigurable
{
public:
	// !!!Important !!! The last argument must be VT_EMPTY, identifying vaarg list end
	/* ... */
	virtual HRESULT CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...) = 0;
	virtual HRESULT CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, va_list args) = 0;
	/* ... */
};

class CSerializerSrv :
	public ISerializer,
	public ILoggerCallback
{
public:
	/* .... */
	virtual HRESULT CallMethod(PVOID pvObject, VARIANT&amp; vtRet, LPCTSTR pszMethodName, LPCTSTR pszGUID, VARENUM eVarType, ...);
	/* .... */
};
</code></pre>
<p>Kann mir jemand erklaeren, welche Methode jetzt mit dem Aufruf von CallMethod in der Methode CallMethod aufgerufen wird? Es sollte ja die der Basisklasse sein, oder? Leider ist diese gerade so virtuell genug, dass das so irgendwie nicht funktionieren kann ... . Und warum kann man das va_end einfach weglassen?</p>
<p>Gruesse, ein Frohes Neues Jahr und Danke schon mal,</p>
<p>Axel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954476</guid><dc:creator><![CDATA[Axel++]]></dc:creator><pubDate>Mon, 02 Jan 2006 09:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste - seltsames Beispiel on Mon, 02 Jan 2006 09:27:07 GMT]]></title><description><![CDATA[<p>es wird der entsprechende override (da die funktion virtuell ist) der zweiten virtuellen memberfunktion (der ohne ellipse) aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/954505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/954505</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 02 Jan 2006 09:27:07 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste - seltsames Beispiel on Tue, 03 Jan 2006 10:35:56 GMT]]></title><description><![CDATA[<p>Und normalerweise sollte sich dein Compiler auch beschweren, wenn deine eigene Klasse keine Version dieser Methode zur Verfügung stellt (mindestens eine Warnung wegen überdeckter Funktionsdefinition).</p>
<p>(und anschließend sieht es so aus, als ob diese Methode sich auch um den Aufruf des va_end kümmern muß)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/955393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/955393</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 03 Jan 2006 10:35:56 GMT</pubDate></item><item><title><![CDATA[Reply to Variable Parameterliste - seltsames Beispiel on Tue, 03 Jan 2006 11:27:02 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>(und anschließend sieht es so aus, als ob diese Methode sich auch um den Aufruf des va_end kümmern muß)</p>
</blockquote>
<p>Und genau das macht sie nicht, genaugenommen kommt va_end im ganzen Projekt nicht einmal vor ... . Weiss jemand, ob das evtl. ein Memory-Leak verursachen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/955453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/955453</guid><dc:creator><![CDATA[Axel++]]></dc:creator><pubDate>Tue, 03 Jan 2006 11:27:02 GMT</pubDate></item></channel></rss>