Beispiel
#define Echo(a) a
#define Echo(a) (a)
Mir ist klar, dass es hier wahrscheinlich keinen signifikanten Unterschied gibt, aber warum sollten Sie jemals die einbeziehen wollen a
in Klammern innerhalb des Makrokörpers? Wie verändert es sich?
Angenommen, Sie haben
#define mul(x, y) x * y
Was passiert, wenn ich sage:
mul(a + 5, 6); /* a + 5 * 6 */
Wenn ich jetzt das Makro etwas verändere:
#define mul(x, y) ((x) * (y))
mul(a + 5, 6); /* ((a + 5) * (6)) */
Denken Sie daran, die Argumente werden nicht ausgewertet oder so, es wird nur eine Textersetzung durchgeführt.
BEARBEITEN
Eine Erklärung dazu, wie das gesamte Makro in Klammern steht, finden Sie unter die Verbindung Gepostet von Nate CK.
Nur fürs Protokoll, ich bin hier gelandet, wie man mathematische Fehler bei der Verwendung von Makros behebt, und ich werde versuchen, diese Antwort hier so zu erweitern, dass sie zu der anderen passt.
Sie fragen nach dem Unterschied zu:
#define Echo( a ) a
#define Echo( a ) ( a )
was in Ordnung ist, solange Sie das Makro selbst nicht verstehen (ich bin auch kein Experte 🙂 ).
Zunächst einmal wissen Sie (wahrscheinlich) bereits, dass es Operator Precedence gibt, also gibt es einen großen Unterschied zwischen diesen beiden Programmen:
1):
#include <stdio.h>
#define ADD( a , b ) a + b
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( 2 + a , 2 + b );
printf( "%d", c );
return 0;
}
Ausgabe:
19
und:
#include <stdio.h>
#define ADD( a , b ) ( a ) + ( b )
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( a , b );
printf( "%d", c );
return 0;
}
Ausgabe:
15
Lassen Sie uns nun voranstellen +
mit *
:
#define ADD( a, b ) a * b
Der Compiler behandelt a * b
wie zum Beispiel a == 5
und b == 10
was tut 5 * 10
.
Aber wenn du sagst:
ADD ( 2 + a * 5 + b )
Wie hier:
#include <stdio.h>
#define ADD( a , b ) ( a ) * ( b )
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( 2 + a , 5 + b );
printf( "%d", c );
return 0;
}
Du erhältst 105
weil der Operator Vorrang beteiligt ist und behandelt
2 + b * 5 + a
wie
( 2 + 5 ) * ( 5 + 10 )
welches ist
( 7 ) * ( 15 )
== 105
Aber wenn du es tust:
#include <stdio.h>
#define ADD( a, b ) a * b
int main( void )
{
auto const int a = 5;
auto const int b = 10;
auto const int c = ADD ( 2 + a , 5 + b );
printf( "%d", c );
return 0;
}
du erhältst 37
durch
2 + 5 * 5 + 10
was bedeutet:
2 + ( 5 * 5 ) + 10
was bedeutet:
2 + 25 + 10
Kurze Antwort, es gibt einen großen Unterschied zwischen:
#define ADD( a , b ) a * b
und
#define ADD( a , b ) ( a ) * ( a )
mögliches Duplikat von Die Notwendigkeit von Klammern in Makros in C
– Paläc
29. April 2015 um 8:35 Uhr
Die Frage Die Notwendigkeit von Klammern in Makros in C ist ein Duplikat davon und nicht umgekehrt und wird nun als solche geschlossen.
– Jonathan Leffler
10. Februar 2018 um 20:58 Uhr
Verwandte Fragen: Können wir die Klammern um Argumente in C-Makrodefinitionen entfernen? und Wann können die Klammern um Argumente in Makros weggelassen werden?
– Jonathan Leffler
10. Februar 2018 um 21:01 Uhr