Kurs programowania w C cz. 76

Nasza ocena:

5
Pobrań: 7
Wyświetleń: 602
Komentarze: 0
Notatek.pl

Pobierz ten dokument za darmo

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

Fragment notatki:

92 ROZDZIAŁ 12. PREPROCESOR #include  #define KWADRAT(x) ((x)*(x)) int main () { printf ("2 do kwadratu wynosi %d\n", KWADRAT(2)); return 0; } Preprocesor w miejsce wyrażenia KWADRAT(2) wstawił ((2)*(2)). Zastanówmy się, co stałoby się, gdybyśmy napisali KWADRAT("2"). Preprocesor po prostu wstawi na- pis do kodu, co da wyrażenie (("2")*("2")), które jest nieprawidłowe. Kompilator zgłosi błąd, ale programista widzi tylko w kodzie użycie makra a nie prawdziwą przy- czynę błędu. Widać tu, że bezpieczniejsze jest użycie funkcji, które dają możliwość wyspecyfikowania typów argumentów. Nawet jeżeli program się skompiluje to makro może dawać nieoczekiwany wynik. Jest tak w przypadku poniższego kodu: int x = 1; int y = KWADRAT(++x); Dzieje się tak dlatego, że makra rozwijane są przez preprocesor i kompilator widzi kod: int x = 1; int y = ((++x)*(++x)); Również poniższe makra są błędne pomimo, że opisany problem w nich nie wystę- puje: #define SUMA(a, b) a + b #define ILOCZYN(a, b) a * b Dają one nieoczekiwane wyniki dla wywołań: SUMA(2, 2) * 2; /* 6 zamiast 8 */ ILOCZYN(2 + 2, 2 + 2); /* 8 zamiast 16 */ Z tego powodu istotne jest użycie nawiasów: #define SUMA(a, b) ((a) + (b)) #define ILOCZYN(a, b) ((a) * (b)) # oraz ## Dość ciekawe możliwości ma w makrach znak „#”. Zamienia on na napis stojący za nim identyfikator. #include  #define wypisz(x) printf("%s=%i\n", #x, x); int main() ... zobacz całą notatkę



Komentarze użytkowników (0)

Zaloguj się, aby dodać komentarz