Подтвердить что ты не робот

Используются ли орграфы и триграфы сегодня?

Учитывая, что когда-то были причины использовать орграфы и триграфы в C и С++, кто-нибудь помещает их в код, который сейчас пишется? Есть ли сколько-нибудь значительное количество устаревшего кода, находящегося под техобслуживанием, которое содержит их?

(Примечание: здесь "орграф" не означает "направленный график". Оба digraph и trigraph имеют несколько значений, но предполагаемое использование здесь - это последовательности, такие как ??= или <:, чтобы присутствовать в таких символах, как # и [)

4b9b3361

Ответ 1

Существует предложение , ожидающее подтверждения для С++ 1z (следующий стандарт после С++ 1y будет стандартизован в -hopefully-С++ 14), целью которого является удаление триграфов из Стандарта. Они провели тематическое исследование на нераскрытой большой кодовой базе:

Пример из практики

Использование тригароподобных конструкций в одной большой кодовой базе было рассмотрены. Мы обнаружили:

923 экземпляра экранированного экрана? в строковой литературе, чтобы избежать триграфа replacement: string pattern() const {return "foo -???? \? - of -?????"; }

4 экземпляра триграмм используются сознательно в тестовом коде: два в набор тестов для компилятора, два других в наборе тестов для повысить препроцессорную библиотеку.

0 экземпляров триграмм, являющихся намеренно используется в производственном кодексе. Триграфы по-прежнему создают бремя для пользователей С++.

В предложении отмечается (смелый акцент с первоначального предложения):

Если триграфы полностью удалены из языка, реализация, которая хочет поддержать их, может продолжать делать это: ее сопоставление, определяемое реализацией, от физических символов исходного файла до основной набор символов источника может включать в себя триграфный перевод (и может даже избежать этого в рамках строковых литералов). Нам не нужны триграфы в стандарте для обратной совместимости.

Ответ 2

Я не знаю точно, но вы, скорее всего, найдете орграфы и триграфы, используемые в средах мейнфреймов IBM. Набор EBCDIC не содержит некоторых символов, которые требуются для C.

Другим оправданием для орграфов и триграфов, 7-битных наборов символов ASCII-ish, которые заменяют некоторые символы пунктуации акцентированными буквами, вероятно, сегодня менее актуально.

Вне таких сред, я подозреваю, что триграфы чаще используются по ошибке, чем преднамеренно, как в:

puts("What happened??!");

Для справки, триграфы были введены в стандарте ANSI C 1989 года (который по существу стал стандартом ISO ISO 1990). Это:

??= #     ??) ]     ??! |
??( [     ??' ^     ??> }
??/ \     ??< {     ??- ~

Замены происходят в любом месте исходного кода, включая комментарии и строковые литералы.

Диграфы представляют собой альтернативные варианты написания определенных токенов и не влияют на комментарии или литералы:

<: [      :>   ]
<% {      %>   }
%: #      %:%: ##

Диффрафы были внесены в поправку 1995 года к стандарту ISO C 1990 года.

Ответ 4

Использование tri и di-graph не записывается в этот день, оно существует только в очень старом коде, который был создан в очень ограниченной среде. Любой код, который содержит триграфы, если вы попытаетесь скомпилировать их в современном компиляторе, таком как VS, он обычно не компилируется, если вы не укажете опцию компоновщика. Я знаю, что для Visual Studio этот параметр является "/Zc: trigraphs"

Почему они существуют, потому что комитет С++ никогда не выпускает изменений, которые бы "сломали" устаревший код. Лучше или хуже. Существует анекдот о том, что их удаление было предложено и поддержано, и оно было остановлено одиноким представителем IBM.

Ответ 5

Я знаю, что это старый вопрос, но в наши дни возможно законное использование: сенсорные экраны без реальной клавиатуры. Например, типичная раскладка клавиатуры для США не всегда доступна в полной форме, если вы производите кодирование с помощью планшета или что-то в этом роде, что, по общему признанию, является, как мы надеемся, редким из-за того, насколько это громоздко (три щелчка мышью для оператора присваивания), Я лично не использую их, если это возможно, но они полезны в отсутствие фактических жетонов, которые они должны представлять.

Опять же, я действительно надеюсь, что люди избегают этого, когда это возможно, но это одна из причин узнать и использовать их.