Nehmen Sie eine API an, in der jede Funktion einen Fehlercode zurückgibt, der Null ist, wenn kein Fehler vorliegt, und ungleich Null für Fehlerwerte.C statische Inline-Parameterauswertung Optimierung
Lassen Sie in diesem APIint foo(...);
int bar(...);
Funktionen sein. Lassen Sie ein Codefragment, in der foo
und bar
haben, um und foo und bar sollte immer genannt werden, aufgerufen werden, unabhängig von vorherigen Fehlern aber die zurück ersten Nicht-Null-Fehlercode propagiert werden, dh
int foobar(...)
{
int rc = 0, rc_;
/* ... */
rc_ = foo(...); rc = rc ? rc : rc_;
rc_ = bar(...); rc = rc ? rc : rc_;
return rc;
}
Schreiben der RC, rc_ Multiplexing ist ermüdend und fehleranfällig (egal ob ein ternärer Operator, wenn/sonst oder etwas anderes verwendet wird).
Es werde eine Fehler propagiert Helferfunktion
static inline
int rc_propagate(int r, int p){ return p ? p : r; }
Diese
int foobar(...)
{
int rc = 0;
/* ... */
rc = rc_propagate(foo(...), rc);
rc = rc_propagate(bar(...), rc);
return rc;
}
in foobar
wie diese
rc_propagate
, eine statische Inline-Funktion, in das ternäre, so dass es aufgrund der ternären Operator-Bewertungsregeln nicht ausgeführt werden kann, wenn der zweite Parameter
p
ungleich Null war?
ich nicht glaube, aber ich werde warten, bis jemand zu zitieren der relevante Teil des Standards. – immibis
@ 2501: Nur, dass es in diesem Fall keine externe Funktion ist, sondern statisch inline.Meine Zweifel betreffen ausschließlich statische Inline; speziell habe ich gerade ein paar Blogeinträge der LLVM-Entwickler gelesen und mögliche Optimierungen hinsichtlich des Aufrufs von Funktionen, die inline statisch sind. – datenwolf
Nebenbei, warum schreibst du nicht einfach: 'rc = rc? rc: foo (...); 'und vermeiden Sie das Problem insgesamt? – 2501