C/Przenośność programów: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
T ziel (dyskusja | edycje)
Nie podano opisu zmian
Mina86 (dyskusja | edycje)
Linia 12:
Zachowania niezdefiniowane są o wiele groźniejsze, gdyż zaistnienie takowego może spowodować dowolny efekt, który nie musi być nigdzie udokumentowany. Przykładem może tutaj być próba odwołania się do wartości wskazywanej przez wskaźnik o wartości NULL.
 
Jeżeli gdzieś w naszym programie zaistnieje sytuacja niezdefiniowanego zachowania, to nie jest już to kwestia przenośności kodu, ale po prostu błędu w programiekodzie, aczkolwiekchyba nieże zawsze.świadomie Otóżkorzystamy nicz nierozszerzenia stoinaszego naprocesora. przeszkodzie,Rozważmy abyodwoływanie konkretnysię kompilatordo opisałwartości działaniewskazywanej jakiegośprzez wyrażenia,wskaźnik któreo wartości NULL. Ponieważ według standardu należyoperacja dotaka omawianejma klasyniezdefiniowany zachowań.skutek Takto częstow bywaszczególności zmoże operatoremspowodować przesunięciajakiejś bitowegoz działającegogóry dlaokreślonej liczbfunkcji ujemnych.- Wkompilator takichmoże przypadkachcoś nadaltakiego pozostajezrealizować jednaksprawdzając kwestiawartość przenośnościwskaźnika koduprzed ikażdą jeżelidereferencją, zależyw namten nasposób niej,niezdefiniowane niezachowanie możemydla korzystaćkonkretnego zkompilatora takichstanie udogodnieńsię kompilatorajak najbardziej zdefiniowane.
 
Sytuacją wziętą z życia są operatory przesunięć bitowych, gdy działają na liczbach ze znakiem. Konkretnie przesuwanie w lewo liczb jest tak naprawdę niezdefiniowane. Bardzo często jednak, w dokumentacji kompilatora działanie przesunięć bitowych dla liczb ze znakiem jest dokładnie opisanych. Jest to o tyle interesujący fakt, iż wielu programistów nie zdaje sobie z niego sprawy i nieświadomie korzysta z rozszerzeń kompilatora.
Istnieje jeszcze trzecia klasa zachowań. Zachowania nieokreślone (ang. ''unspecified behaviour''). Są to sytuacje, gdy standard określa kilka możliwych sposobów w jaki dane wyrażenie może działać i pozostawia kompilatorowi decyzję co z tym dalej zrobić. Coś takiego nie musi być nigdzie opisane w dokumentacji i znowu poleganie na konkretnym zachowaniu jest błędem. Klasycznym przykładem może być kolejność obliczania argumentów wywołania funkcji.
 
Istnieje jeszcze trzecia klasa zachowań. Zachowania nieokreślone (ang. ''unspecified behaviour''). Są to sytuacje, gdy standard określa kilka możliwych sposobów w jaki dane wyrażenie może działać i pozostawia kompilatorowi decyzję co z tym dalej zrobić. Coś takiego nie musi być nigdzie opisane w dokumentacji i znowu poleganie na konkretnym zachowaniu jest błędem. Klasycznym przykładem może być kolejność obliczania argumentów wywołania funkcji.
 
== Rozmiar zmiennych ==