<?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[Public API Methods with errorCode.]]></title><description><![CDATA[<p>Guten Morgen Leute,</p>
<p>ich habe eine c library,  und möchte für meine Public API eine allgmeine errorCode konzept implementieren.</p>
<p>Nun habe ich zwei möglichkeiten:</p>
<ol>
<li>Out Parameter:</li>
</ol>
<pre><code class="language-cpp">typedef struct  { int code :} tErrorCode;

int performOperation(int input, tErrorCode*errorCode) {
// do something
    *errorCode.code = // 0 ok otherwise error
// do something
    return // any result
}
</code></pre>
<ol start="2">
<li>return mutliple return struct :</li>
</ol>
<pre><code class="language-cpp">
typedef struct  { int code :} tErrorCode;

typedef struct {
    int result;
    tErrorCode error;
} OperationResult;

OperationResult performOperation(int input) {
    OperationResult opResult;
 // do something
        opResult.error.code= // 0 ok otherwise error
        opResult.result = // result;
   // do something
    return opResult;
}
</code></pre>
<p>mir persönlich gefällt variante 1 besser.. nun frage mich mich ob es noch eine weitere Möglichkeit gibt? oder welche Würde ihr nehmen vor und nachteile?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/355321/public-api-methods-with-errorcode</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 15:36:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/355321.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Jun 2025 08:47:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Public API Methods with errorCode. on Fri, 13 Jun 2025 09:07:42 GMT]]></title><description><![CDATA[<p>Guten Morgen Leute,</p>
<p>ich habe eine c library,  und möchte für meine Public API eine allgmeine errorCode konzept implementieren.</p>
<p>Nun habe ich zwei möglichkeiten:</p>
<ol>
<li>Out Parameter:</li>
</ol>
<pre><code class="language-cpp">typedef struct  { int code :} tErrorCode;

int performOperation(int input, tErrorCode*errorCode) {
// do something
    *errorCode.code = // 0 ok otherwise error
// do something
    return // any result
}
</code></pre>
<ol start="2">
<li>return mutliple return struct :</li>
</ol>
<pre><code class="language-cpp">
typedef struct  { int code :} tErrorCode;

typedef struct {
    int result;
    tErrorCode error;
} OperationResult;

OperationResult performOperation(int input) {
    OperationResult opResult;
 // do something
        opResult.error.code= // 0 ok otherwise error
        opResult.result = // result;
   // do something
    return opResult;
}
</code></pre>
<p>mir persönlich gefällt variante 1 besser.. nun frage mich mich ob es noch eine weitere Möglichkeit gibt? oder welche Würde ihr nehmen vor und nachteile?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2623958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2623958</guid><dc:creator><![CDATA[SoIntMan]]></dc:creator><pubDate>Fri, 13 Jun 2025 09:07:42 GMT</pubDate></item><item><title><![CDATA[Reply to Public API Methods with errorCode. on Fri, 13 Jun 2025 09:18:00 GMT]]></title><description><![CDATA[<p>Unter diesen beiden: Variante 1. Du solltest auch die Möglichkeit durchdenken, dass nicht der Caller das errorCode-Struct eingibt, sondern dass der Fehlerverursacher das Objekt erzeugt. Und es ansonsten <code>NULL</code> setzt. Das macht die Benutzung sehr viel einfacher und es werden auch nur im Bedarfsfall Error-Structs erzeugt. Fehlerbehandlung ist dann auch sehr lesbar:</p>
<pre><code>ErrorCode *error;
my_function(error);
if (error) ...
</code></pre>
<p>Hintereinanderschalten und Schachtlung von Funktionen und Durchreichen von Fehlern ist auch einfach. Siehe beispielsweise hier, wie das in bekannten und erfolgreichen Libraries gemacht wird:<br />
<a href="https://docs.gtk.org/glib/error-reporting.html" rel="nofollow">https://docs.gtk.org/glib/error-reporting.html</a><br />
(und viele andere auch, denn das Konzept ist solide)</p>
<p>Zwei Möglichkeiten will ich noch erwähnen:</p>
<ul>
<li>Klassisch mit globalem Error-Flag, wie mit ERRNO &amp; Co. in der Standardbibliothek. Bin kein Fan, die Probleme sind offensichtlich. Aber es ist einfach und unsichtbar.</li>
<li>Wenn du immer überall objektorientiert bist (oder wenigstens dort, wo Fehler passieren können), also deine Ergebnisse immer per Pointerargument zurück in deine &quot;Objekte&quot; schreibst, dann bleibt der Rückgabewert für Fehlercodes frei. Siehe beispielsweise Linux-Syscalls, die fast alle einen int zurück geben, der den Erfolg oder nicht-Erfolg der Funktion beschreibt. Nur triviale Getter-Funktionen, bei denen nichts schief gehen kann, geben direkt einen Wert zurück. Das ist auch ein solides Konzept.</li>
</ul>
<p>Was ich auch immer im fragen würde bei der Entscheidung ist, ob und wie leicht der Anwender die Fehlerprüfung vergessen kann, und was für Konsequenzen das hätte:</p>
<ul>
<li>Bei einem expliziten error-Parameter kann man das gar nicht vergessen und es wäre schon sehr schlampig als Anwender, diesen nicht auszuwerten, wenn man ihn übergibt. Dafür <em>muss</em> man ihn aber auch immer angeben, ob man will oder nicht.</li>
<li>Bei einem Rückgabewert (und erst recht ganz schlimm einem globalen Flag) kann man die Auswertung auch vergessen. Klingt erst einmal schlimm, aber sind wir doch mal ehrlich: Wie oft habt ihr schon den Rückgabewert von <code>printf</code> ausgewertet? Wusstet ihr überhaupt, dass das einen Fehlerindikator hat, der ausgewertet werden kann? Nicht alles, was theoretisch schief gehen kann, braucht man praktisch zu prüfen.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2623959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2623959</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 13 Jun 2025 09:18:00 GMT</pubDate></item><item><title><![CDATA[Reply to Public API Methods with errorCode. on Fri, 13 Jun 2025 11:22:26 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/34916">@SoIntMan</a></p>
<p>Ich nutze einen Ansatz ähnlich zu 1.)</p>
<pre><code class="language-cpp">typedef int tErrorCode;             ///&lt; 0 = OK, &lt; 0 = Fehlercode
#define ERR_CODE_FOO;


tErrorCode Foo()
{
}

bool Bar(tErrorCode* Err)
{
}
</code></pre>
<p>Ein Struct birgt meiner Meinung nach die Gefahr dass man weitere Elemente hinzufügt, welche sich nicht unbedingt mit der API Schnittstelle vertragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2623960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2623960</guid><dc:creator><![CDATA[Quiche Lorraine]]></dc:creator><pubDate>Fri, 13 Jun 2025 11:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to Public API Methods with errorCode. on Sat, 14 Jun 2025 14:06:11 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a> sagte in <a href="/forum/post/2623959">Public API Methods with errorCode.</a>:</p>
<blockquote>
<p>Unter diesen beiden: Variante 1. Du solltest auch die Möglichkeit durchdenken, dass nicht der Caller das errorCode-Struct eingibt, sondern dass der Fehlerverursacher das Objekt erzeugt. Und es ansonsten <code>NULL</code> setzt. Das macht die Benutzung sehr viel einfacher und es werden auch nur im Bedarfsfall Error-Structs erzeugt. Fehlerbehandlung ist dann auch sehr lesbar:</p>
<pre><code>ErrorCode *error;
my_function(error);
if (error) ...
</code></pre>
<p>Hintereinanderschalten und Schachtlung von Funktionen und Durchreichen von Fehlern ist auch einfach. Siehe beispielsweise hier, wie das in bekannten und erfolgreichen Libraries gemacht wird:<br />
<a href="https://docs.gtk.org/glib/error-reporting.html" rel="nofollow">https://docs.gtk.org/glib/error-reporting.html</a><br />
(und viele andere auch, denn das Konzept ist solide)</p>
<p>Zwei Möglichkeiten will ich noch erwähnen:</p>
<ul>
<li>Klassisch mit globalem Error-Flag, wie mit ERRNO &amp; Co. in der Standardbibliothek. Bin kein Fan, die Probleme sind offensichtlich. Aber es ist einfach und unsichtbar.</li>
<li>Wenn du immer überall objektorientiert bist (oder wenigstens dort, wo Fehler passieren können), also deine Ergebnisse immer per Pointerargument zurück in deine &quot;Objekte&quot; schreibst, dann bleibt der Rückgabewert für Fehlercodes frei. Siehe beispielsweise Linux-Syscalls, die fast alle einen int zurück geben, der den Erfolg oder nicht-Erfolg der Funktion beschreibt. Nur triviale Getter-Funktionen, bei denen nichts schief gehen kann, geben direkt einen Wert zurück. Das ist auch ein solides Konzept.</li>
</ul>
<p>Was ich auch immer im fragen würde bei der Entscheidung ist, ob und wie leicht der Anwender die Fehlerprüfung vergessen kann, und was für Konsequenzen das hätte:</p>
<ul>
<li>Bei einem expliziten error-Parameter kann man das gar nicht vergessen und es wäre schon sehr schlampig als Anwender, diesen nicht auszuwerten, wenn man ihn übergibt. Dafür <em>muss</em> man ihn aber auch immer angeben, ob man will oder nicht.</li>
<li>Bei einem Rückgabewert (und erst recht ganz schlimm einem globalen Flag) kann man die Auswertung auch vergessen. Klingt erst einmal schlimm, aber sind wir doch mal ehrlich: Wie oft habt ihr schon den Rückgabewert von <code>printf</code> ausgewertet? Wusstet ihr überhaupt, dass das einen Fehlerindikator hat, der ausgewertet werden kann? Nicht alles, was theoretisch schief gehen kann, braucht man praktisch zu prüfen.</li>
</ul>
</blockquote>
<p>Hallo, danke für deine Ausführungen.</p>
<p>In meinem Fall &quot;muss&quot; der Error-Struct instanc bzw die Referenz definitiv vorhanden sein, da die Lib ein statische objekt model verwendet (kein malloc darf verwendet werden) . Ein error null ptr wird mit einem eigenes assert callback (release) geprüft. (oder ich setze einfach kein errorCode, und implementiere das selbe verhalten mit oder ohne error instanz.</p>
<p>Wenn methoden keinen wird zurück geben, würde ich trotzdem gern per Konvention ein error ref mitgeben... so meine Idee der API <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>Und ein Globales error like GetError WinApi oder so, wäre nichts für mich;)</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/35432">@Quiche-Lorraine</a> sagte in <a href="/forum/post/2623960">Public API Methods with errorCode.</a>:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/34916">@SoIntMan</a></p>
<p>Ich nutze einen Ansatz ähnlich zu 1.)</p>
<pre><code class="language-cpp">typedef int tErrorCode;             ///&lt; 0 = OK, &lt; 0 = Fehlercode
#define ERR_CODE_FOO;


tErrorCode Foo()
{
}

bool Bar(tErrorCode* Err)
{
}
</code></pre>
<p>Ein Struct birgt meiner Meinung nach die Gefahr dass man weitere Elemente hinzufügt, welche sich nicht unbedingt mit der API Schnittstelle vertragen.</p>
</blockquote>
<p>Ich hätte mir gern ein error struckt mit 2 integer :</p>
<pre><code class="language-cpp">typedef struct{ int modulID; int errorCode} eError;
</code></pre>
<p>aber klar muss mir mal die &quot;user&quot; perspektive anschauen,  ob das ganze dann auch &quot;schön&quot; anwendbar ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2623961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2623961</guid><dc:creator><![CDATA[SoIntMan]]></dc:creator><pubDate>Sat, 14 Jun 2025 14:06:11 GMT</pubDate></item></channel></rss>