2016-04-26 12 views
1

Ich las this Tutorial von Stanford, wo sie sagen:Bad Klammern in Makrodefinition

gemeinsame Codierung Fehler:

Bad Klammern in Makrodefinition

#define min(a, b) a<b?a:b // incorrect 
#define min(a, b) (((a)<(b))?(a):(b)) // correct 

Ich lief dies auch in ein Programm, es hat gut funktioniert.

Kann jemand erklären, was sie sagen wollen!

+1

Entweder Form ist schlecht. Der richtige Weg, dies zu tun ist 'int min (int a, int b) {zurück a Lundin

+1

Sie müssen bedenken, dass Makros keine Funktionen sind, sie ersetzen buchstäblich nur den von Ihnen definierten Text. Wenn Sie sie also in komplexeren Situationen verwenden, wie jemand bereits darauf hingewiesen hat, könnten Sie einige Probleme finden: –

+0

Die Notwendigkeit für Klammern in Makros in C] (https://stackoverflow.com/questions/10820340/the-need-for-parentheses-in-macros-in-c) –

Antwort

5

Die erste Version schlägt fehl, wenn Sie es mit anderen Betreibern kombinieren:

min(a , b) + c 

und übersetzt:

a<b?a:b+c 

die identisch ist:

a<b?a:(b+c) 

was ein unerwartetes Ergebnis gegeben die Startklammer.

Die zweite Version ist nicht viel besser. Es wertet einen der Parameter zweimal aus, was zu unerwartetem Verhalten führen kann, wenn eine Funktion oder i++ an das Makro übergeben wird.

Anstelle dieser Makros sollte eine Inline-Funktion verwendet werden.

+2

"Es wertet einen der Parameter zweimal aus, was dazu führen kann undefined Verhalten "Nein, das ist in diesem speziellen Fall nicht korrekt. Zwischen der Auswertung des 1. und 2. oder 3. Operanden liegt ein Sequenzpunkt. – Lundin

+0

das unexpected Verhalten, wenn i ++ übergeben wird, ist wegen der ternären Operator da sein, nicht wahr? oder muss es etwas mit Makro machen ..? –

+0

@GauravArora Nein, das liegt daran, dass funktionsähnliche Makros im Allgemeinen unsicher sind und sehr schlecht funktionieren. – Lundin