Szukaj…


Uwagi

Przegląd

Standard C opisuje składnię języka, funkcje zapewniane przez bibliotekę standardową oraz zachowanie zgodnych procesorów C (z grubsza mówiąc, kompilatorów) i zgodnych programów C. W odniesieniu do zachowania standard w przeważającej części określa szczególne zachowania programów i procesorów. Z drugiej strony niektóre operacje mają jawne lub dorozumiane niezdefiniowane zachowanie - takich operacji zawsze należy unikać, ponieważ nie można na nich polegać. W międzyczasie istnieje wiele zachowań zdefiniowanych dla implementacji . Zachowania te mogą się różnić między procesorami C, środowiskami uruchomieniowymi i bibliotekami standardowymi (zbiorowo, implementacjami ), ale są spójne i niezawodne dla dowolnej implementacji, a zgodne implementacje dokumentują ich zachowanie w każdym z tych obszarów.

Czasami rozsądne jest, aby program polegał na zachowaniu zdefiniowanym przez implementację. Na przykład, jeśli program jest specyficzny dla konkretnego środowiska operacyjnego, wówczas prawdopodobnie nie będzie problemu poleganie na zachowaniach zdefiniowanych dla implementacji ogólnych dla typowych procesorów dla tego środowiska. Alternatywnie, można użyć dyrektyw kompilacji warunkowej, aby wybrać zachowania zdefiniowane w implementacji odpowiednie dla implementacji w użyciu. W każdym razie istotne jest, aby wiedzieć, które operacje mają zachowanie zdefiniowane w ramach implementacji, aby albo ich uniknąć, albo podjąć świadomą decyzję o tym, czy i jak z nich korzystać.

Zestawienie tych uwag stanowi listę wszystkich zachowań i cech zdefiniowanych w implementacji określonych w normie C2011, z odniesieniem do normy. Wiele z nich używa terminologii standardu . Niektóre inne opierają się bardziej ogólnie na kontekście standardu, na przykład osiem etapów tłumaczenia kodu źródłowego na program lub różnica między implementacjami hostowanymi i wolnostojącymi. Niektóre, które mogą być szczególnie zaskakujące lub godne uwagi, zostały przedstawione pogrubioną czcionką. Nie wszystkie opisane zachowania są obsługiwane przez wcześniejsze standardy C, ale ogólnie mówiąc, mają zachowanie zdefiniowane w implementacji we wszystkich wersjach standardu, które je obsługują.

Programy i procesory

Generał

  • Liczba bitów w jednym bajcie ( 3,6 / 3 ). Przynajmniej 8 rzeczywista wartość może być CHAR_BIT za pomocą makra CHAR_BIT .

  • Które komunikaty wyjściowe są uważane za „komunikaty diagnostyczne” ( 3.10 / 1 )

Tłumaczenie źródłowe

  • Sposób, w jaki znaki wielobajtowe fizycznego pliku źródłowego są mapowane na źródłowy zestaw znaków ( 5.1.1.2/1 ).

  • Określa, czy niepuste sekwencje białych znaków nowej linii są zastępowane pojedynczymi spacjami podczas fazy tłumaczenia 3 ( 5.1.1.2/1 )

  • Znaki zestawu wykonawczego, na które konwertowane są literały znakowe i znaki w stałych łańcuchowych (podczas fazy tłumaczenia 5), gdy poza tym nie ma odpowiadającego znaku ( 5.1.1.2/1 ).

Środowisko działania

  • Sposób identyfikacji komunikatów diagnostycznych, które mają być emitowane ( 5.1.1.3/1 ).

  • Nazwa i typ funkcji wywoływanej podczas uruchamiania w implementacji wolnostojącej ( 5.1.2.1/1 ).

  • Które biblioteki są dostępne w implementacji wolnostojącej, poza określonym zestawem minimalnym ( 5.1.2.1/1 ).

  • Wpływ zakończenia programu w środowisku wolnostojącym ( 5.1.2.1/2 ).

  • W środowisku hostowanym wszelkie dozwolone podpisy funkcji main() inne niż int main(int argc, char *arg[]) i int main(void) ( 5.1.2.2.1 / 1 ).

  • Sposób, w jaki hostowana implementacja definiuje ciągi wskazane przez drugi argument main() ( 5.1.2.2.1 / 2 ).

  • Co stanowi „urządzenie interaktywne” do celów sekcji 5.1.2.3 (Wykonanie programu) i 7.21.3 (Pliki) ( 5.1.2.3/7 ).

  • Wszelkie ograniczenia dotyczące obiektów, do których odwołują się procedury obsługi przerwań w implementacji optymalizującej ( 5.1.2.3/10 ).

  • W implementacji wolnostojącej, czy obsługiwanych jest wiele wątków wykonania ( 5.1.2.4/1 ).

  • Wartości członków zestawu znaków wykonawczych ( 5.2.1 / 1 ).

  • Wartości char odpowiadające zdefiniowanym alfabetycznym sekwencjom ucieczki ( 5.2.2 / 3 ).

  • Graniczne liczby całkowite i zmiennoprzecinkowe oraz charakterystyki ( 5.2.4.2/1 ).

  • Dokładność operacji arytmetycznych zmiennoprzecinkowych i konwersji standardowej biblioteki z wewnętrznych reprezentacji zmiennoprzecinkowych na reprezentacje łańcuchowe ( 5.2.4.2.2 / 6 ).

  • Wartość makra FLT_ROUNDS , która koduje domyślny tryb zaokrąglania zmiennoprzecinkowego ( 5.2.4.2.2 / 8 ).

  • Zachowania zaokrąglania charakteryzujące się obsługiwanymi wartościami FLT_ROUNDS większymi niż 3 lub mniejszymi niż -1 ( 5.2.4.2.2 / 8 ).

  • Wartość makra FLT_EVAL_METHOD , która charakteryzuje zachowanie zmiennoprzecinkowe ( 5.2.4.2.2 / 9 ).

  • Zachowanie charakteryzujące się dowolnymi obsługiwanymi wartościami FLT_EVAL_METHOD mniejszymi niż -1 ( 5.2.4.2.2 / 9 ).

  • Wartości makr FLT_HAS_SUBNORM , DBL_HAS_SUBNORM i LDBL_HAS_SUBNORM , charakteryzujące, czy standardowe formaty zmiennoprzecinkowe obsługują liczby nienormalne ( 5.2.4.2.2 / 10 )

Rodzaje

  • Wynik próby (pośredniego) dostępu do obiektu z czasem przechowywania wątku z wątku innego niż ten, z którym obiekt jest powiązany ( 6.2.4 / 4 )

  • Wartość char do którego przypisano znak spoza podstawowego zestawu wykonawczego ( 6.2.5 / 3 ).

  • Obsługiwane rozszerzone typy liczb całkowitych ze znakiem, jeśli istnieją, ( 6.2.5 / 4 ) oraz wszelkie słowa kluczowe używane do ich identyfikacji.

  • Czy char ma taką samą reprezentację i zachowanie jak signed char lub unsigned char ( 6.2.5 / 15 ). Można zapytać o CHAR_MIN , który jest albo 0 albo SCHAR_MIN jeśli char jest odpowiednio niepodpisany lub podpisany.

  • Liczba, kolejność i kodowanie bajtów w reprezentacjach obiektów , z wyjątkiem przypadków wyraźnie określonych przez standard ( 6.2.6.1/2 ).

  • Która z trzech rozpoznawanych form reprezentacji liczb całkowitych ma zastosowanie w danej sytuacji i czy pewne wzorce bitowe obiektów liczb całkowitych są reprezentacjami pułapek ( 6.2.6.2/2 ).

  • Wymóg dostosowania dla każdego typu ( 6.2.8 / 1 ).

  • Czy i w jakich kontekstach obsługiwane są jakiekolwiek rozszerzone dopasowania ( 6.2.8 / 3 ).

  • Zestaw obsługiwanych rozszerzonych dopasowań ( 6.2.8 / 4 ).

  • Konwersja liczb całkowitych obejmuje dowolne rozszerzone typy liczb całkowitych ze znakiem względem siebie ( 6.3.1.1/1 ).

  • Efekt przypisania wartości spoza zakresu do liczby całkowitej ze znakiem ( 6.3.1.3/3 ).

  • W przypadku gdy w zasięgu, ale wartość nieprzedstawialne jest przypisany do obiektów zmiennoprzecinkowej, jak wartość reprezentacja jest przechowywany w obiekcie jest wybrany z pomiędzy dwoma najbliższymi do zakodowania wartości ( 6.3.1.4/2 ; 6.3.1.5/1 ; 6.4.4.2 / 3 ).

  • Wynik konwersji liczby całkowitej na typ wskaźnika , z wyjątkiem wyrażeń stałych całkowitoliczbowych o wartości 0 ( 6.3.2.3/5 ).

Formularz źródłowy

  • Lokalizacje w dyrektywach #pragma których rozpoznawane są tokeny nazw nagłówków ( 6.4 / 4 ).

  • Znaki, w tym znaki wielobajtowe, inne niż podkreślenie, nieakcentowane litery łacińskie, nazwy znaków uniwersalnych i cyfry dziesiętne, które mogą pojawiać się w identyfikatorach ( 6.4.2.1/1 ).

  • Liczba znaczących znaków w identyfikatorze ( 6.4.2.1/5 ).

  • Z pewnymi wyjątkami sposób, w jaki znaki źródłowe w stałej liczb całkowitych są odwzorowywane na znaki zestawu wykonawczego ( 6.4.4.4/2 ; 6.4.4.4/10 ).

  • Bieżące ustawienia narodowe używane do obliczania wartości szerokiej stałej znakowej oraz większość innych aspektów konwersji dla wielu takich stałych ( 6.4.4.4/11 ).

  • Określa, czy znaczniki literału o różnym przedrostku mogą być konkatenowane, a jeśli tak, traktowanie wynikowej sekwencji znaków wielobajtowych ( 6.4.5 / 5 )

  • Ustawienia narodowe używane podczas fazy tłumaczenia 7 do konwersji literałów szerokiego łańcucha na wielobajtowe sekwencje znaków oraz ich wartość, gdy wynik nie jest reprezentatywny w zestawie znaków wykonania ( 6.4.5 / 6 ).

  • Sposób mapowania nazw nagłówków na nazwy plików ( 6.4.7 / 2 ).

Ocena

  • Określa, czy i jak wyrażenia zmiennoprzecinkowe są FP_CONTRACT gdy nie jest używany FP_CONTRACT ( 6.5 / 8 ).

  • Wartości wyników sizeof i _Alignof ( 6.5.3.4/5 ).

  • Wielkość typu wyniku odejmowania wskaźnika ( 6.5.6 / 9 ).

  • Wynik przesunięcia w prawo liczby całkowitej ze znakiem o wartości ujemnej ( 6.5.7 / 5 ).

Zachowanie w czasie wykonywania

  • Stopień skuteczności słowa kluczowego register ( 6.7.1 / 6 ).

  • Określa, czy typ pola bitowego zadeklarowanego jako int jest tego samego typu, co unsigned int czy jako signed int ( 6.7.2 / 5 ).

  • Jakie typy pól bitowych mogą przyjmować, inne niż opcjonalnie kwalifikowane _Bool , signed int i unsigned int ; czy pola bitowe mogą mieć typy atomowe ( 6.7.2.1/5 ).

  • Aspekty tego, jak implementacje rozkładają pamięć dla pól bitowych ( 6.7.2.1/11 ).

  • Wyrównanie członków struktur i związków niebędących bitfieldami ( 6.7.2.1/14 ).

  • Typ podstawowy dla każdego wyliczonego typu ( 6.7.2.2/4 ).

  • Co stanowi „dostęp” do obiektu typu volatile ( 6.7.3 / 7 ).

  • Skuteczność deklaracji funkcji inline ( 6.7.4 / 6 ).

Preprocesor

  • Czy stałe znaków są konwertowane na wartości całkowite w taki sam sposób w warunkach wstępnych procesora jak w wyrażeniach zwykłych i czy stała jednoznakowa może mieć wartość ujemną ( 6.10.1 / 4 ).

  • Lokalizacje szukały plików wskazanych w dyrektywie #include ( 6.10.2 / 2-3 ).

  • Sposób, w jaki nazwa nagłówka jest tworzona na podstawie tokenów dyrektywy #include zawierającej wiele tokenów ( 6.10.2 / 4 ).

  • Limit #include nesting ( 6.10.2 / 6 ).

  • Czy znak \ jest wstawiany przed \ wprowadzeniem uniwersalnej nazwy znaku w wyniku operatora # preprocesora ( 6.10.3.2/2 ).

  • Zachowanie dyrektywy #pragma przetwarzania wstępnego dla pragmatów innych niż STDC ( 6.10.6 / 1 ).

  • Wartość makr __DATE__ i __TIME__ jeśli odpowiednio nie jest dostępna data ani godzina tłumaczenia ( 6.10.8.1/1 ).

  • Wewnętrzne kodowanie znaków używane dla wchar_t jeśli makro __STDC_ISO_10646__ nie jest zdefiniowane ( 6.10.8.2/1 ).

  • Wewnętrzne kodowanie znaków używane dla char32_t jeśli makro __STDC_UTF_32__ nie jest zdefiniowane ( 6.10.8.2/1 ).

Biblioteka standardowa

Generał

  • Format komunikatów emitowanych w przypadku niepowodzenia asercji ( 7.2.1.1/2 ).

Funkcje środowiska zmiennoprzecinkowego

  • Wszelkie dodatkowe wyjątki zmiennoprzecinkowe poza tymi zdefiniowanymi w normie ( 7.6 / 6 ).

  • Wszelkie dodatkowe tryby zaokrąglania zmiennoprzecinkowego poza tymi zdefiniowanymi w normie ( 7.6 / 8 ).

  • Wszelkie dodatkowe środowiska zmiennoprzecinkowe poza zdefiniowanymi w normie ( 7.6 / 10 ).

  • Domyślna wartość zmiennoprzecinkowego przełącznika dostępu do środowiska ( 7.6.1 / 2 ).

  • Reprezentacja zmiennych stanu zmiennoprzecinkowego zarejestrowanych przez fegetexceptflag() ( 7.6.2.2/1 ).

  • Czy funkcja feraiseexcept() dodatkowo podnosi wyjątek zmiennoprzecinkowy „niedokładny”, ilekroć podnosi wyjątek zmiennoprzecinkowy „przepełnienie” lub „niedomiar” ( 7.6.2.3/2 ).

Funkcje związane z ustawieniami regionalnymi

Funkcje matematyczne

  • Typy reprezentowane przez float_t i double_t gdy makro FLT_EVAL_METHOD ma wartość inną niż 0 , 1 i 2 ( 7.12 / 2 ).

  • Wszelkie obsługiwane klasyfikacje zmiennoprzecinkowe poza tymi zdefiniowanymi w normie ( 7.12 / 6 ).

  • Wartość zwrócona przez math.h działa w przypadku błędu domeny ( 7.12.1 / 2 ).

  • Wartość zwrócona przez math.h działa w przypadku błędu bieguna ( 7.12.1 / 3 ).

  • Wartość zwracana przez math.h działa, gdy wynik jest poniżej wartości, oraz aspekty określające, czy errno jest ustawione na ERANGE i czy w takich okolicznościach powstaje wyjątek zmiennoprzecinkowy ( 7.12.1 / 6 ).

  • Domyślna wartość przełącznika skurczu FP ( 7.12.2 / 2 ).

  • Określa, czy funkcje fmod() zwracają 0, czy fmod() błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.1/3 ).

  • Określa, czy remainder() funkcje remainder() zwracają 0, czy zgłaszają błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.2/3 ).

  • Liczba znaczących bitów w remquo() ilorazowych obliczonych przez funkcje remquo() ( 7.12.10.3/2 ).

  • Określa, czy funkcje remquo() zwracają 0, czy remquo() błąd domeny, gdy ich drugim argumentem jest 0 ( 7.12.10.3/3 ).

Sygnały

  • Pełny zestaw obsługiwanych sygnałów, ich semantyka i ich domyślna obsługa ( 7.14 / 4 ).

  • Gdy sygnał zostanie podniesiony, a do tego sygnału przypisana jest niestandardowa procedura obsługi, która ewentualne sygnały są blokowane na czas wykonywania procedury obsługi ( 7.14.1.1/3 ).

  • Które sygnały inne niż SIGFPE , SIGILL i SIGSEGV powodują, że zachowanie po powrocie z niestandardowej procedury obsługi sygnału jest niezdefiniowane ( 7.14.1.1/3 ).

  • Które sygnały są początkowo skonfigurowane do ignorowania (niezależnie od ich domyślnej obsługi; 7.14.1.1/6 ).

Różne

  • Określona stała wskaźnika zerowego, do którego rozwija się makro NULL ( 7,19 / 3 ).

Funkcje obsługi plików

  • Czy ostatni wiersz strumienia tekstowego wymaga kończącego znaku nowej linii ( 7.21.2 / 2 ).

  • Liczba znaków pustych automatycznie dołączanych do strumienia binarnego ( 7.21.2 / 3 ).

  • Początkowa pozycja pliku otwartego w trybie dołączania ( 7.21.3 / 1 ).

  • Czy zapis w strumieniu tekstu powoduje obcinanie strumienia ( 7.21.3 / 2 ).

  • Obsługa buforowania strumienia ( 7.21.3 / 3 ).

  • Czy faktycznie istnieją pliki o zerowej długości ( 7.21.3 / 4 ).

  • Zasady tworzenia poprawnych nazw plików ( 7.21.3 / 8 ).

  • Czy ten sam plik może być jednocześnie otwierany wiele razy ( 7.21.3 / 8 ).

  • Charakter i wybór kodowania znaków wielobajtowych ( 7.21.3 / 10 ).

  • Zachowanie funkcji remove() gdy plik docelowy jest otwarty ( 7.21.4.1/2 ).

  • Zachowanie funkcji rename() gdy plik docelowy już istnieje ( 7.21.4.2/2 ).

  • Czy pliki utworzone za pomocą funkcji tmpfile() są usuwane w przypadku nieprawidłowego zakończenia pracy programu ( 7.21.4.3/2 ).

  • Który tryb zmienia się, w jakich okolicznościach dozwolone są przez freopen() ( 7.21.5.4/3 ).

Funkcje we / wy

  • Które z dozwolonych reprezentacji nieskończonych i nie-liczbowych wartości FP są generowane przez funkcje rodziny printf () - ( 7.21.6.1/8 ).

  • Sposób, w jaki wskaźniki są formatowane przez printf() rodziny printf() ( 7.21.6.1/8 ).

  • Zachowanie rodziny scanf() funkcjonuje, gdy znak - pojawia się na wewnętrznej pozycji listy skanowania w polu [ 7.21.6.2/12 ).

  • Większość aspektów obsługi pól p funkcje scanf() ( 7.21.6.2/12 ).

  • Wartość errno ustawiona przez fgetpos() w przypadku niepowodzenia ( 7.21.9.1/2 ).

  • Wartość errno ustawiona przez fsetpos() w przypadku niepowodzenia ( 7.21.9.3/2 ).

  • Wartość errno ustawiona przez ftell() w przypadku niepowodzenia ( 7.21.9.4/3 ).

  • Znaczenie funkcji strtod() niektórych obsługiwanych aspektów formatowania NaN ( 7.22.1.3p4 ).

  • Określa, czy funkcje strtod() ustawiają errno na ERANGE gdy wynik jest niedostateczny ( 7.22.1.3/10 ).

Funkcje alokacji pamięci

  • Zachowanie funkcji alokacji pamięci, gdy żądana liczba bajtów wynosi 0 ( 7.22.3 / 1 ).

Funkcje środowiska systemowego

  • Jakie ewentualne czyszczenia są wykonywane i jaki status jest zwracany do systemu operacyjnego hosta po wywołaniu funkcji abort() ( 7.22.4.1/2 ).

  • Jaki status jest zwracany do środowiska hosta po wywołaniu metody exit() ( 7.22.4.4/5 ).

  • Obsługa otwartych strumieni i jaki status jest zwracany do środowiska hosta, gdy _Exit() jest _Exit() ( 7.22.4.5/2 ).

  • Zbiór nazw środowiska dostępnych za pośrednictwem getenv() i metoda zmiany środowiska ( 7.22.4.6/2 ).

  • Zwracana wartość funkcji system() ( 7.22.4.8/3 ).

Funkcje daty i godziny

  • Lokalna strefa czasowa i czas letni ( 7.27.1 / 1 ).

  • Zakres i precyzja czasów reprezentowanych przez typy clock_t i time_t ( 7.27.1 / 4 ).

  • Początek ery, która służy jako odniesienie dla czasów zwracanych przez funkcję clock() ( 7.27.2.1/3 ).

  • Początek epoki, która służy jako odniesienie dla czasów zwracanych przez funkcję timespec_get() (gdy podstawą czasu jest TIME_UTC ; 7.27.2.5/3 ).

  • Zastąpienie strftime() dla specyfikatora konwersji %Z w ustawieniach regionalnych „C” ( 7.27.3.5/7 ).

Szeroko znakowe funkcje we / wy

  • Które z dozwolonych reprezentacji nieskończonych i nie-liczbowych wartości FP są generowane przez funkcje rodziny wprintf() ( 7.29.2.1/8 ).

  • Sposób, w jaki wskaźniki są formatowane przez funkcje rodziny wprintf() ( 7.29.2.1/8 ).

  • Zachowanie wscanf() -funkcji działa, gdy znak - pojawia się na wewnętrznej pozycji listy skanowania [ pola ( 7.29.2.2/12 ).

  • Większość aspektów wscanf() pól p funkcje wscanf() ( 7.29.2.2/12 ).

  • Znaczenie funkcji rodziny wstrtod() niektórych obsługiwanych aspektów formatowania NaN ( 7.29.4.1.1 / 4 ).

  • Określa, czy funkcje wstrtod() ustawiają errno na ERANGE gdy wynik jest niedostateczny ( 7.29.4.1.1 / 10 ).

Prawe przesunięcie ujemnej liczby całkowitej

int signed_integer = -1;

// The right shift operation exhibits implementation-defined behavior:
int result = signed_integer >> 1;

Przypisywanie wartości spoza zakresu do liczby całkowitej

// Supposing SCHAR_MAX, the maximum value that can be represented by a signed char, is
// 127, the behavior of this assignment is implementation-defined:
signed char integer;
integer = 128;

Przydział zero bajtów

// The allocation functions have implementation-defined behavior when the requested size
// of the allocation is zero.
void *p = malloc(0);

Reprezentacja podpisanych liczb całkowitych

Każdy podpisany typ liczb całkowitych może być reprezentowany w jednym z trzech formatów; który jest zdefiniowany w implementacji, który jest używany. Implementacja używana dla dowolnego określonego typu liczby całkowitej co najmniej tak szerokiej jak int może być określona w czasie wykonywania na podstawie dwóch bitów najniższego rzędu reprezentacji wartości -1 w tym typie, tak jak:

enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)

switch (SIGN_REP(long)) {
   case sign_magnitude: { /* do something */ break; }
   case ones_compl:     { /* do otherwise */ break; }
   case twos_compl:     { /* do yet else  */ break; }
   case 0:  { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}

Ten sam wzorzec dotyczy reprezentacji węższych typów, ale nie można ich przetestować za pomocą tej techniki, ponieważ argumenty & podlegają „zwykłej konwersji arytmetycznej” przed obliczeniem wyniku.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow