Trigraphs spadły
Pliki źródłowe są kodowane w fizycznym zestawie znaków, który jest odwzorowywany w sposób zdefiniowany w implementacji na źródłowy zestaw znaków zdefiniowany w standardzie. Aby uwzględnić odwzorowania z niektórych fizycznych zestawów znaków, które natywnie nie miały wszystkich znaków interpunkcyjnych wymaganych w źródłowym zestawie znaków, język definiował trygrafy - sekwencje trzech typowych znaków, których można użyć zamiast mniej powszechnych znaków interpunkcyjnych. Do ich obsługi wymagany był preprocesor i kompilator.
W C ++ 17 trójgrafy zostały usunięte. Dlatego niektóre pliki źródłowe nie będą akceptowane przez nowsze kompilatory, chyba że zostaną najpierw przetłumaczone z fizycznego zestawu znaków na inny fizyczny zestaw znaków, który odwzorowuje jeden do jednego na źródłowy zestaw znaków. (W praktyce większość kompilatorów właśnie uczyniła interpretację trygrafów opcjonalną.) Nie jest to subtelna zmiana zachowania, ale przełomowa zmiana, która uniemożliwia kompilację wcześniej akceptowanych plików źródłowych bez zewnętrznego procesu tłumaczenia.
Więcej ograniczeń char
Norma odnosi się również do zestawu znaków wykonania , który jest zdefiniowany w ramach implementacji, ale musi zawierać co najmniej cały zestaw znaków źródłowych oraz niewielką liczbę kodów sterujących.
Standard C ++ zdefiniowany char
jako typ całkowity bez znaku, który może efektywnie reprezentować każdą wartość w zestawie znaków wykonania. Z przedstawicielem prawnika językowego możesz argumentować, że a char
musi mieć co najmniej 8 bitów.
Jeśli Twoja implementacja używa wartości bez znaku dla char
, to wiesz, że może ona wynosić od 0 do 255, a zatem jest odpowiednia do przechowywania każdej możliwej wartości bajtu.
Ale jeśli Twoja implementacja używa podpisanej wartości, ma opcje.
Większość użyłaby dopełnienia do dwóch, dając char
minimalny zakres od -128 do 127. To 256 unikalnych wartości.
Ale inną opcją był znak + wielkość, gdzie jeden bit jest zarezerwowany, aby wskazać, czy liczba jest ujemna, a pozostałe siedem bitów wskazuje wielkość. Dałoby char
to zakres od -127 do 127, czyli tylko 255 unikatowych wartości. (Ponieważ tracisz jedną użyteczną kombinację bitów, która reprezentuje -0.)
Nie jestem pewien, czy komisja kiedykolwiek wyraźnie określiła to jako wadę, ale to dlatego, że nie można było polegać na standardzie, który gwarantuje, że podróż w obie strony z unsigned char
do char
iz powrotem zachowa pierwotną wartość. (W praktyce wszystkie implementacje działały, ponieważ wszystkie używały dopełnienia do dwóch dla podpisanych typów całkowitych).
Dopiero niedawno (C ++ 17?) Poprawiono sformułowanie, aby zapewnić działanie w obie strony. Ta poprawka, wraz ze wszystkimi innymi wymaganiami dotyczącymi char
, skutecznie upoważnia uzupełnienie do dwóch dla podpisanych, char
nie mówiąc tego wyraźnie (nawet jeśli standard nadal zezwala na reprezentacje znak + wielkość dla innych podpisanych typów całkowitych). Istnieje propozycja, aby wszystkie podpisane typy całkowite używały dopełnienia do dwóch, ale nie pamiętam, czy trafiło to do C ++ 20.
Więc ten jest przeciwieństwem tego, czego szukasz, ponieważ daje wcześniej nieprawidłowy, zbyt arogancki kod, naprawę wsteczną.