Используются ли орграфы и триграфы сегодня?
Учитывая, что когда-то были причины использовать орграфы и триграфы в C и С++, кто-нибудь помещает их в код, который сейчас пишется? Есть ли сколько-нибудь значительное количество устаревшего кода, находящегося под техобслуживанием, которое содержит их?
(Примечание: здесь "орграф" не означает "направленный график". Оба digraph и trigraph имеют несколько значений, но предполагаемое использование здесь - это последовательности, такие как ??=
или <:
, чтобы присутствовать в таких символах, как #
и [
)
Ответы
Ответ 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 года.
Ответ 3
Их можно использовать для Международный конкурс Obfuscated C Code.
Ответ 4
Использование tri и di-graph не записывается в этот день, оно существует только в очень старом коде, который был создан в очень ограниченной среде. Любой код, который содержит триграфы, если вы попытаетесь скомпилировать их в современном компиляторе, таком как VS, он обычно не компилируется, если вы не укажете опцию компоновщика. Я знаю, что для Visual Studio этот параметр является "/Zc: trigraphs"
Почему они существуют, потому что комитет С++ никогда не выпускает изменений, которые бы "сломали" устаревший код. Лучше или хуже. Существует анекдот о том, что их удаление было предложено и поддержано, и оно было остановлено одиноким представителем IBM.
Ответ 5
Я знаю, что это старый вопрос, но в наши дни возможно законное использование: сенсорные экраны без реальной клавиатуры. Например, типичная раскладка клавиатуры для США не всегда доступна в полной форме, если вы производите кодирование с помощью планшета или что-то в этом роде, что, по общему признанию, является, как мы надеемся, редким из-за того, насколько это громоздко (три щелчка мышью для оператора присваивания), Я лично не использую их, если это возможно, но они полезны в отсутствие фактических жетонов, которые они должны представлять.
Опять же, я действительно надеюсь, что люди избегают этого, когда это возможно, но это одна из причин узнать и использовать их.