BIBLIOTECZNE PROBLEMY 175 #include #include int main() { uint32_t val = 0x04030201; unsigned char *v = (unsigned char *)&val; int byte_order = v[0] * 1000 + v[1] * 100 + v[2] * 10 + v[3]; if (byte_order == 4321) { printf("Porządek big-endian (4321)\n"); } else if (byte_order == 1234) { printf("Porządek little-endian (1234)\n"); } else if (byte_order == 3412) { printf("Porządek PDP (3412)\n"); } else { printf("Inny porządek (%d)\n", byte_order); } return 0; } Powyższe przykłady opisują jedynie część problemów jakie mogą wynikać z próby prze- noszenia binarnych danych pomiędzy wieloma platformami. Wszystkie co więcej zakładają, że bajt ma 8 bitów, co wcale nie musi być prawdą dla konkretnej architektury, na którą piszemy aplikację. Co więcej liczby mogą posiadać w swojej reprezentacje bity wypełnienia (ang. padding bits ), które nie biorą udziały w przechowywaniu wartości liczby. Te wszystkie różnice mogą dodatkowo skomplikować kod. Toteż należy być świadomym, iż przenosząc dane binarnie musimy uważać na różne reprezentacje liczb. Biblioteczne problemy Pisząc programy nieraz będziemy musieli korzystać z różnych bibliotek. Problem polega na tym, że nie zawsze będą one dostępne na komputerze, na którym inny użytkownik naszego programu będzie próbował go kompilować. Dlatego też ważne jest, abyśmy korzystali z łatwo dostępnych bibliotek, które dostępne są na wiele różnych systemów i platform sprzętowych. Zapamiętaj : Twój program jest na tyle przenośny na ile przenośne są biblioteki z których korzysta! Kompilacja warunkowa Przy zwiększaniu przenośności kodu może pomóc preprocessor. Przyjmijmy np., że chcemy korzystać ze słówka kluczowego inline wprowadzonego w standardzie C99, ale równocześnie chcemy, aby nasz program był rozumiany przez kompilatory ANSI C. Wówczas, możemy skorzystać z następującego kodu: #ifndef __inline__ # if __STDC_VERSION__ = 199901L # define __inline__ inline # else # define __inline__ # endif #endif
... zobacz całą notatkę
Komentarze użytkowników (0)