Gibt es einen Trick, C-Makro zu verbieten, als linker Wert aufgerufen zu werden?

7

Zum Beispiel

%Vor%

Ich möchte einen Makroaufruf wie diesen verbieten, ohne die bestehende Makroschnittstelle zu ändern.

%Vor%

Irgendeine Idee?

    
wsxiaoys 15.04.2011, 11:11
quelle

9 Antworten

8

Versuchen Sie Folgendes:

%Vor%     
R.. 15.04.2011, 11:29
quelle
6
%Vor%     
Alexey Malistov 15.04.2011 11:15
quelle
5

Ich würde mit der Inline-Funktion gehen, aber wenn Sie ein Makro wollen:

%Vor%     
AProgrammer 15.04.2011 11:28
quelle
3

Ich glaube nicht, dass es irgendeinen Weg gibt, das zu verhindern. Wahrscheinlich wäre der beste Weg, keine Makros zu verwenden.

    
ColWhi 15.04.2011 11:15
quelle
3

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.

    
quelle
1

Vielleicht const , obwohl es einen expliziten Typ erfordert:

%Vor%

... wenn Sie die typeof -Compiler-Erweiterung haben:

%Vor%     
aib 15.04.2011 11:23
quelle
1

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

verwenden %Vor%     
Johannes Schaub - litb 15.04.2011 12:03
quelle
0

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:

%Vor%     
Jens Gustedt 15.04.2011 11:56
quelle
0

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.

    
Lundin 15.04.2011 12:01
quelle

Tags und Links