Триграфи впали
Вихідні файли кодуються у фізичному наборі символів, який відображається визначеним реалізацією способом із вихідним набором символів , який визначений у стандарті. Для розміщення зіставлення з деяких фізичних наборів символів, які спочатку не мали всіх знаків пунктуації, необхідних вихідному набору символів, мовою визначені триграфи - послідовності трьох загальних символів, які можна використовувати замість менш поширених знаків пунктуації. Для їх обробки вимагався препроцесор та компілятор.
У C ++ 17 триграфи видалено. Отже, деякі вихідні файли не будуть прийняті новими компіляторами, якщо вони не будуть спочатку перекладені з фізичного набору символів у якийсь інший фізичний набір символів, який відображає один на один вихідний набір символів. (На практиці більшість компіляторів просто зробили інтерпретацію триграфів необов’язковою.) Це не тонка зміна поведінки, а повна зміна, яка перешкоджає компіляції раніше прийнятних вихідних файлів без зовнішнього процесу перекладу.
Більше обмежень на char
Стандарт також посилається на набір символів виконання , який визначений реалізацією, але повинен містити принаймні весь набір вихідних символів плюс невелику кількість контрольних кодів.
Стандарт C ++, визначений char
як цілісний тип без підпису, який може ефективно представляти кожне значення в наборі символів виконання. З поданням мовного юриста ви можете стверджувати, що a char
має бути принаймні 8 біт.
Якщо у вашій реалізації використовується беззнакове значення для char
, тоді ви знаєте, що воно може коливатися від 0 до 255, і, отже, підходить для зберігання всіх можливих байтових значень.
Але якщо ваша реалізація використовує підписане значення, вона має варіанти.
Більшість використовували б доповнення двох, даючи char
мінімальний діапазон від -128 до 127. Це 256 унікальних значень.
Але іншим варіантом був знак + величина, де один біт зарезервований, щоб вказати, чи число від'ємне, а інші сім бітів вказують величину. Це дало б char
діапазон від -127 до 127, що становить лише 255 унікальних значень. (Оскільки ви втрачаєте одну корисну бітову комбінацію для представлення -0.)
Я не впевнений, що комітет коли-небудь чітко визначив це як дефект, але це було тому, що ви не могли покладатися на стандарт, щоб гарантувати, що поїздка в обидва кінці від і unsigned char
до char
назад збереже початкову вартість. (На практиці всі реалізації робили це тому, що всі вони використовували доповнення двох для підписаних цілісних типів.)
Лише нещодавно (C ++ 17?) Формулювання було виправлено, щоб забезпечити обхід. Це виправлення, разом з усіма іншими вимогами щодо char
, фактично вимагає доповнення двох для підписаних, char
не кажучи цього прямо (навіть якщо стандарт продовжує допускати подання знак + величина для інших підписаних цілих типів). Існує пропозиція вимагати, щоб усі підписані цілісні типи використовували доповнення two, але я не пам’ятаю, чи перетворився він на C ++ 20.
Отже, цей начебто є протилежним тому, що ви шукаєте, оскільки він дає раніше неправильний надмірно зухвалий код зворотну силу.