Перейти к содержанию

Последнее обновление:2026-10-12

Триграфы в C++

C++那些事: об удалении триграфов

До C++17 триграфы (Trigraph) были возможностью писать программы с использованием небольших символьных кодов вроде ISO/IEC 646; они появились в C89. В ISO/IEC 646 отсутствуют перечисленные ниже символы, используемые в C, поэтому для их экранирования применяются последовательности с ??:

Триграф Заменяемый символ
??= #
??( [
??) ]
??< {
??> }
??/ \
??! |
??- ~
??' ^

Символ \? экранируется, чтобы предотвратить его замену по таблице триграфов.

В C++17 триграфы удалены, и ??= и подобные последовательности больше не заменяются.

Пример

До C++17:

std::cout << "??=" << std::endl;
std::cout << "??(" << std::endl;
std::cout << "?\?(" << std::endl;

Вывод:

#
[
??(

C++17 и более поздние версии:

??=
??(
??(

Сейчас, поскольку кодировки вроде Unicode стали повсеместными, триграфы больше не нужны, и компиляторы вроде gcc по умолчанию их отключают.

Похожие темы

Комментарии