Weźmy makro obliczyć maksymalnie dwóch wartości:
#define MAX(a, b) ((a) < (b) ? (a) : (b))
Następnie używamy go tak:
int x = 5;
int y = 10;
int max = MAX(x++, y++);
Wtedy makro jest rozszerzona do
int max = ((x++) < (y++) ? (x++) : (y++));
Jak widać, operacja inkrementacji na x
lub y
stanie się dwa razy, a nie to, co by się stało, gdybyś miał funkcję, w której każdy argument, który zdałeś, jest oceniany tylko raz.
Innym ważnym punktem jest użycie nawiasów w makrze. Weźmy inny prostego makra:
#define MUL(a, b) a * b
Teraz, jeśli wywołać makro jak
int sum = MUL(x + 3, y - 2);
następnie ekspansja staje
int sum = x + 3 * y - 2;
które ze względu na operator precedence jest równa
int sum = x + (3 * y) - 2;
Często nie do końca oczekiwano, jeśli ktoś oczekuje (x + 3) * (y - 2)
.
Ten problem jest również "rozwiązywany" za pomocą funkcji.
Schildt jest [przez niektórych sceptycznie postrzegany] (https://en.wikipedia.org/wiki/Herbert_Schildt#Reception). Tylko mówię'. – DevSolar
@DevSolar: Nie znam tej książki, ale jeśli cytowane stwierdzenie jest typowe dla tego stylu, w pełni zgadzam się ze sceptykami. – Olaf
@DevSolar Masz na myśli [sceptyczny] (https://www.google.com/search?q=define%3Askceptical), prawda? A może pisałeś to z [C] (https://pl.wikipedia.org/wiki/C_ (programming_language)), ponieważ to pytanie zostało otagowane [tag: c], a nie [tag: k]? : P – cat