Поделиться через


Триграфы

Кодировка исходного кода исходных программ на языке C содержится в 7-разрядной кодировке ASCII, но в то же время является надмножеством инвариантной кодировки ISO 646-1983. Последовательности триграфа позволяют писать программы на языке C с использованием только инвариантной кодировки, соответствующей стандартам ISO. Триграфы — это последовательности из трех символов (которым предшествует два вопросительных знака), которые компилятор заменяет соответствующими знаками пунктуации. Триграфы можно использовать в файлах исходного кода на языке C с набором символов, который не содержит удобных графических представлений некоторых знаков пунктуации.

C++17 удаляет триграфы из языка. Поддержка триграфов может сохраняться при определяемом реализацией сопоставлении физического исходного файла с основной кодировкой исходного кода, хотя обычно это не рекомендуется. C++14 обеспечивает такую же поддержку триграфов как в языке C.

Visual C++ по-прежнему поддерживает подстановку триграфов, но по умолчанию она отключена. Сведения о том, как включить подстановку триграфов, см. в статье /Zc:trigraphs (подстановка триграфов).

В следующей таблице показаны девять последовательностей триграфов. Все вхождения знаков препинания в первом столбце файла исходного кода заменяются соответствующим символом во втором столбце.

Последовательности триграфов

Триграф Знак препинания
??= #
??( [
??/ \
??) ]
??' ^
??< {
??! |
??> }
??- ~

Триграф всегда отображается как один символ исходного кода. Преобразование триграфов происходит на первом этапе перевода перед распознаванием escape-символов в строковых литералах и символьных константах. Распознаются только девять триграфов, отображаемых в таблице выше. Все другие последовательности символов остаются непреобразованными.

Последовательность escape-символов, \?, не позволяет неверно интерпретировать символьные последовательности, напоминающие триграфы. (Сведения о escape-последовательностях см. в разделе Escape-последовательности.) Например, при попытке распечатать строку What??! с помощью этой printf инструкции

printf( "What??!\n" );

напечатанная строка имеет вид What|, так как ??! — это триграфическая последовательность, которая заменяется символом |. Напишите инструкцию следующим образом, чтобы правильно напечатать строку:

printf( "What?\?!\n" );

В этой инструкции printf escape-символ обратной косой черты перед вторым вопросительным знаком не позволяет неверно интерпретировать ??! как триграф.

См. также

/Zc:trigraphs (подстановка триграфов)
Идентификаторы C