<?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[C-API mit Referenzparametern]]></title><description><![CDATA[<p>Hi Community!</p>
<p>Folgende Situation: Ich habe eine MSVC C++ DLL die nach aussen hin ein entsprechendes Interface (C++!) bereitstellt. Alle Symbole werden demangled exportiert und haben explizit eine <code>__cdecl</code> Calling Convention. Zudem sind alle verwendeten Typen C-Konform. Da allerdings Referenzparameter verwendet werden und ich jetzt doch eine voll C-Kompatible Schnittstelle bilden muss, bau ich das etwas um.</p>
<p>Hier ein Beispiel wie das Interface aufgebaut ist:</p>
<pre><code>// SYMPUBLIC ist entweder __declspec(dllexport/-import), je nachdem
// CALL ist __cdecl

#ifdef __cplusplus
extern &quot;C&quot; {
#endif

SYMPUBLIC int CALL getFoo(int&amp; foo);

#ifdef __cplusplus
}
#endif
</code></pre>
<p>Normalerweise müsste ich ja jetzt aus dem Referenzparameter einen Pointertype machen damit auch ein C was mit der Deklaration anfangen kann. Bevor ich jetzt aber anfange und mir die Arbeit mache auch meine ganzen .cpp Files anzupassen, die Lib ist nicht gerade klein, dachte ich mir ich bin ein ganz schlauer Fuchs und mache einfach das hier in meinen Headern draus:</p>
<pre><code>// REFCALL ist bei __cplusplus &amp; und wenn nicht dann *
// [...]

SYMPUBLIC int CALL getFoo(int REFCALL foo);

// [...]
</code></pre>
<p>Die Aufrufe würden beim Consumer der Lib dann letztendlich so aussehen:</p>
<pre><code>// C++
int foo;
int error = getFoo(foo);

// C
int foo;
int error = getFoo(&amp;foo);
</code></pre>
<p>Meiner Meinung nach wird meiner Lib in beiden Fällen dieselbe Adresse übergeben, und da die Symbole sowieso nicht gemangled sind funktioniert die Auflösung auch erste Klasse. WIE diese Adresse übergeben wurde sollte der Interna der Lib ja total schnuppe sein in diesem Szenario. Das einzige, logischerweise, ist die mögliche Übergabe eines NULL-Pointers, aber das ist aus meiner Sicht jetzt eigentlich nur das einzige Problem...</p>
<p>Liege ich hier total falsch, oder ist das gar ein Standardweg für sowas? Wenn jemand Einwände hat, bitte sofort die rote Flagge heben <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 />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/317261/c-api-mit-referenzparametern</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 16:07:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317261.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 02 Jun 2013 08:06:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C-API mit Referenzparametern on Sun, 02 Jun 2013 08:08:03 GMT]]></title><description><![CDATA[<p>Hi Community!</p>
<p>Folgende Situation: Ich habe eine MSVC C++ DLL die nach aussen hin ein entsprechendes Interface (C++!) bereitstellt. Alle Symbole werden demangled exportiert und haben explizit eine <code>__cdecl</code> Calling Convention. Zudem sind alle verwendeten Typen C-Konform. Da allerdings Referenzparameter verwendet werden und ich jetzt doch eine voll C-Kompatible Schnittstelle bilden muss, bau ich das etwas um.</p>
<p>Hier ein Beispiel wie das Interface aufgebaut ist:</p>
<pre><code>// SYMPUBLIC ist entweder __declspec(dllexport/-import), je nachdem
// CALL ist __cdecl

#ifdef __cplusplus
extern &quot;C&quot; {
#endif

SYMPUBLIC int CALL getFoo(int&amp; foo);

#ifdef __cplusplus
}
#endif
</code></pre>
<p>Normalerweise müsste ich ja jetzt aus dem Referenzparameter einen Pointertype machen damit auch ein C was mit der Deklaration anfangen kann. Bevor ich jetzt aber anfange und mir die Arbeit mache auch meine ganzen .cpp Files anzupassen, die Lib ist nicht gerade klein, dachte ich mir ich bin ein ganz schlauer Fuchs und mache einfach das hier in meinen Headern draus:</p>
<pre><code>// REFCALL ist bei __cplusplus &amp; und wenn nicht dann *
// [...]

SYMPUBLIC int CALL getFoo(int REFCALL foo);

// [...]
</code></pre>
<p>Die Aufrufe würden beim Consumer der Lib dann letztendlich so aussehen:</p>
<pre><code>// C++
int foo;
int error = getFoo(foo);

// C
int foo;
int error = getFoo(&amp;foo);
</code></pre>
<p>Meiner Meinung nach wird meiner Lib in beiden Fällen dieselbe Adresse übergeben, und da die Symbole sowieso nicht gemangled sind funktioniert die Auflösung auch erste Klasse. WIE diese Adresse übergeben wurde sollte der Interna der Lib ja total schnuppe sein in diesem Szenario. Das einzige, logischerweise, ist die mögliche Übergabe eines NULL-Pointers, aber das ist aus meiner Sicht jetzt eigentlich nur das einzige Problem...</p>
<p>Liege ich hier total falsch, oder ist das gar ein Standardweg für sowas? Wenn jemand Einwände hat, bitte sofort die rote Flagge heben <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 />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327938</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Sun, 02 Jun 2013 08:08:03 GMT</pubDate></item><item><title><![CDATA[Reply to C-API mit Referenzparametern on Sun, 02 Jun 2013 08:59:25 GMT]]></title><description><![CDATA[<p>Die ISO Standards erlauben so etwas nicht. Das Verhalten deiner Aktion ist dort nicht definiert.</p>
<p>Dass es bei dir &quot;klappt&quot;, ist jetzt aber auch nicht so verwunderlich. Ich würde sagen, du nutzt Implementierungsdetails aus. Details, die sehr nahe liegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327946</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 02 Jun 2013 08:59:25 GMT</pubDate></item><item><title><![CDATA[Reply to C-API mit Referenzparametern on Sun, 02 Jun 2013 11:33:53 GMT]]></title><description><![CDATA[<p>Nimm doch auch in C++ Pointer? Spricht absolut nichts dagegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2327983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327983</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 02 Jun 2013 11:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to C-API mit Referenzparametern on Sun, 02 Jun 2013 12:25:24 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26744">@Ethon</a><br />
Freilich nicht <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="😉"
    /><br />
Muss jetzt halt nur kurz die Zeit nehmen und in allen .cpp Files den Pointer dereferenzieren, und wenn ich schon dabei bin nullptr-Prüfungen einzubauen.</p>
<p>Hat mich aber nur interessiert in wiefern sowas wie oben zulässig/möglich ist <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2327995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2327995</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Sun, 02 Jun 2013 12:25:24 GMT</pubDate></item></channel></rss>