Ich würde mit der Inline-Funktion gehen, aber wenn Sie ein Makro wollen:
%Vor%Sie können den ternären Operator verwenden, um das Ergebnis des Makros zu einem rvalue zu machen, aber die Fehlermeldung könnte für die Benutzer verwirrend sein:
%Vor% Die Trickserei gibt es in der Semantik dieses spezifischen Operators. Der Typ des Ausdrucks, der nur den Operator enthält, ist ein allgemeiner Typ (oder ein konvertierbarer Typ) der beiden Zweige des Ausdrucks, selbst wenn nur einer von ihnen jemals ausgewertet wird. Wenn der Compiler nun true ? x.left : (node*)0
auswertet, wird er in den Ausdruck x.left
aufgelöst, aber mit dem allgemeinen Typ von x.left
und (node*)0
. Beide sind im Wesentlichen vom selben Typ, mit dem einzigen Detail, dass (node*)0
ein rvalue ist, und nicht ein lvalue.
Für C ++ würde ich unary +:
verwenden %Vor% Für einen allgemeinen Makrofall hat dies den Vorteil gegenüber +0
, dass es auch für void*
und Funktionszeiger funktioniert. Für C können Sie den Komma-Operator
Ich würde mich für eine explizite Besetzung entscheiden
%Vor% Das Ergebnis einer solchen Besetzung ist immer ein rvalue. Wenn Sie außerdem nicht erlauben möchten, zu ändern, worauf die Zeiger zeigen, fügen Sie ein const
hinzu, wie bereits in einer anderen Antwort angegeben:
Sie schreiben "Accessor" -Makros nicht so, Sie tun
%Vor%Dann greifen Sie wie jede andere Variable auf das LEFT-Makro zu. Dies macht den Code lesbarer und deaktiviert gleichzeitig das gesamte unsichere, hässlich aussehende, fehleranfällige undefinierte Verhalten, das mit funktionsähnlichen Makros verbunden ist.