Kurs programowania w C cz. 148

Nasza ocena:

5
Wyświetleń: 455
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

Podgląd dokumentu
Kurs programowania w C  cz. 148 - strona 1

Fragment notatki:

KONWENCJE PISANIA MAKR 167 Konwencje pisania makr Ponieważ makra preprocesora działają na zasadzie zwykłego zastępowania napisów, są podatne na wiele kłopotliwych błędów, z których części można uniknąć przez stosowanie się do poniższych reguł: 1. 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: #define kwadrat(x) (x*x) • Dobrze: #define kwadrat(x) ( (x)*(x) ) •  Przykład:  Załóżmy, że w programie makro kwadrat() zdefiniowane bez nawiasów zostało wywołane następująco: kwadrat(a+b). Wtedy zostanie ono zamienione przez preprocesor na: a+b*a+b. Z kolejności działań wiemy, że najpierw zosta- nie wykonane mnożenie, więc wartość wyrażenia kwadrat(a+b) będzie różna od kwadratu wyrażenia a+b. 2. Umieszczaj nawiasy dookoła całego makra, jeśli jest pojedynczym wyrażeniem. Ponow- nie, chroni to przed zaburzeniem kolejności działań. • Źle: #define kwadrat(x) (x)*(x) • Dobrze: #define kwadrat(x) ( (x)*(x) ) •  Przykład:  Definiujemy makro #define suma(a, b) (a)+(b) i wywołujemy je w kodzie wynik = suma(3, 4) * 5. Makro zostanie rozwinięte jako wynik = 3+4*5, co — z powodu kolejności działań — da wynik inny niż pożądany. 3. Jeśli makro składa się z wielu instrukcji lub deklaruje zmienne, powinno być umieszczo- ne w pętli do { ... } while(0), 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 ma- kra. • Źle: #define FREE(p) free(p); p = NULL; • Dobrze: #define FREE(p) do { free(p); p = NULL; } while(0) 4. Unikaj używania argumentów makra więcej niż raz wewnątrz makra. Może to spowo- dować kłopoty, gdy argument makra ma efekty uboczne (np. zawiera operator inkre- mentacji). •  Przykład:  #define kwadrat(x) ((x)*(x)) nie powinno być wywoływane z ope- ratorem inkrementacji kwadrat(a++) ponieważ zostanie to rozwinięte jako ((a++) * (a++)), co jest niezgodne ze specyfikacją języka i zachowanie takiego wyrażenia jest niezdefiniowane (dwukrotna inkrementacja w tym samym wyrażeniu). 5. Jeśli makro może być w przyszłości zastąpione przez funkcję, rozważ użycie w nazwie małych liter, jak w funkcji. Jak dostać się do konkretnego bitu? Wiemy, że komputer to maszyna, której najmniejszą jednostką pamięci jest bit, jednak w ... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz