C/Powszechne praktyki: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
T ziel (dyskusja | edycje)
Nie podano opisu zmian
m Trochę śmieszne było, że to samo makro raz dostało opis "DOBRZE", a raz "ŹLE". Albo zostawić tak jak teraz jest. Albo to drugie zrobić innym przykładem, albo rozszerzyć komentarz.
Linia 67:
 
# Umieszczaj nawiasy dookoła argumentów makra kiedy to tylko możliwe. Zapewnia to, że gdy są wyrażeniami kolejność działań nie zostanie zmieniona. Na przykład:
#*Źle: <code>#define kwadrat(x) (x*x)</code>
#*Dobrze: <code>#define kwadrat(x) ( (x)*(x) )</code>
#*'''Przykład:''' Załóżmy, że w programie makro kwadrat() zdefiniowane bez nawiasów zostało wywołane następująco: <code>kwadrat(a+b)</code>. Wtedy zostanie ono zamienione przez preprocesor na: <code>a+b*a+b</code>. Z kolejności działań wiemy, że najpierw zostanie wykonane mnożenie, więc wartość wyrażenia <code>kwadrat(a+b)</code> będzie różna od kwadratu wyrażenia <code>a+b</code>.
# Umieszczaj nawiasy dookoła całego makra, jeśli jest pojedynczym wyrażeniem. Ponownie, chroni to przed zaburzeniem kolejności działań.
#*Źle: <code>#define kwadrat(x) (x)*(x)</code>
#*Dobrze: <code>#define kwadrat(x) ( (x)*(x) )</code>
#*'''Przykład:''' Definiujemy makro <code>#define suma(a, b) (a)+(b)</code> i wywołujemy je w kodzie <code>wynik = suma(3, 4) * 5</code>. Makro zostanie rozwinięte jako <code>wynik = 3+4*5</code>, co - z powodu kolejności działań - da wynik inny niż pożądany.
# Jeśli makro składa się z wielu instrukcji lub deklaruje zmienne, powinno być umieszczone w pętli <code>'''do''' { ... } '''while'''(0)</code>, bez kończącego średnika. Pozwala to na użycie makra jak pojedynczej instrukcji w każdym miejscu, jak ciało innego wyrażenia, pozwalając jednocześnie na umieszczenie średnika po makrze bez tworzenia zerowego wyrażenia. Należy uważać, by zmienne w makrze potencjalnie nie kolidowały z argumentami makra.