Niestety, ale makra, w przeciwieństwie do funkcji, podstawiają, a w zasadzie wklejają całą frazę podaną w parametrze. Tzn. że:
Kod: Zaznacz cały
kwadrat(++a); // ++a*++a, czyli 1 * 2, lub 2 * 1 (w zależności od kompilatora)
Nie powinno się preinkrementować (++zmienna) ani postinkrementować (zmnienna++) w jednym wyrażeniu, gdyż wynik jest zależny od inkrementacji preprocesora. Np.
Wartość takiego wyrażenia jest nieprzewidywalna (chyba, że wie się jak jest zaimplementowany używany kompilator)
PS. jeżeli chcesz mieć dobrze działający kod, napisz funkcję zamiast makra: