Warum ist das Max-Makro in C definiert?

8
%Vor%

Warum nicht einfach (a>b ? a : b) ?

    
compiler 16.03.2011, 10:09
quelle

4 Antworten

19

weil anderswo max(f(1), f(2)) eine der beiden Funktionen zweimal aufrufen würde:

%Vor%

statt durch "Caching" der beiden Werte in _a und _b , die Sie haben

%Vor%

(und klar, wie andere darauf hingewiesen haben, gibt es das gleiche Problem mit Autoinkrement / Autodekrement)

Ich denke nicht, dass dies von Visual Studio auf diese Weise unterstützt wird. Dies ist eine zusammengesetzte Aussage. Lesen Sie hier hat msvc analog zu gcc's ({})

Ich füge hinzu, dass die Definition der zusammengesetzten Anweisung im hier gegebenen gcc-Handbuch Ссылка zeigt einen Code sehr ähnlich dem der Frage für max: -)

    
xanatos 16.03.2011, 10:15
quelle
8

Es geht um das Hauptproblem von Dingen wie

%Vor%

wenn Sie es mit aufrufen:

%Vor%

Da es sich um eine einfache Textersetzung handelt, ergibt sich:

%Vor%

was ist nicht was Sie wollen.

Mit:

%Vor%

verwendet temporäre Variablen, die Ihnen effektiv Folgendes bieten:

%Vor%

welche die Nebenwirkungen nur einmal ausführt.

Aber um ehrlich zu sein, sollten Sie dieses Makro komplett ablehnen und eine inline -Funktion oder sogar eine Nicht-Inline-Funktion verwenden, da der Compiler in den meisten Fällen eine anständige Optimierung vornehmen kann, sogar ohne diesen Vorschlag.

    
paxdiablo 16.03.2011 10:16
quelle
3

Eine andere Möglichkeit, um Max zu bestimmen (zumindest für positive Zahlen)

%Vor%

Da a und b nur einmal aufgerufen werden, gibt MAX (a ++, b ++) das korrekte Ergebnis.

    
Nuclear 20.10.2011 18:07
quelle
1

Wenn das Makro mit Ausdruck aufgerufen wird, kann dies zu unerwartetem Verhalten führen. Angenommen, dies:

int c = max(i++, j++);

In diesem Fall wird das Maximum zweimal mit der einfacheren Version erhöht.

    
king_nak 16.03.2011 10:17
quelle

Tags und Links