Триграфы
Кодировка исходного кода исходных программ на языке 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-символ обратной косой черты перед вторым вопросительным знаком не позволяет неверно интерпретировать ??!
как триграф.