Поиск…


замечания

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

Компилятор GCC не распознает их, если вы явно не попросите его сделать это (используйте -trigraphs чтобы включить их, используйте -Wtrigraphs , часть -Wall , чтобы получать предупреждения о триграфах).

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

Кроме того, остерегайтесь случайного использования триграфа ( puts("What happened??!!"); , например).

триграфы

Символы [ ] { } ^ \ | ~ # Часто используются в программах C, но в конце 1980 - х годов, были кодовые наборы в использовании (ISO 646 вариантов, например, в скандинавских странах) , где позиции ASCII символов для них были использованы для национального языка вариантных символов (например , £ для # в Великобритании; Æ Å æ å ø Ø для { } { } | \ в Дании не было ~ в EBCDIC). Это означало, что было сложно написать код на машинах, которые использовали эти наборы.

Чтобы решить эту проблему, в стандарте C было предложено использовать комбинации из трех символов для создания одного символа, называемого триграфом. Триграф представляет собой последовательность из трех символов, первые две из которых являются вопросительными знаками.

Ниже приведен простой пример, который использует последовательности триграмм вместо # , { и } :

??=include <stdio.h>

int main()
??<
    printf("Hello World!\n");
??>

Это будет изменено препроцессором C, заменив триграфы их односимвольными эквивалентами, как если бы код был написан:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
}
триграф эквивалент
знак равно #
?? / \
??» ^
?? ( [
??) ]
??! |
?? < {
??> }
?? - ~

Обратите внимание, что триграфы являются проблематичными, потому что, например ??/ Является обратным слэшем и может влиять на значение строк продолжения в комментариях и должно быть распознано внутри строк и символьных литералов (например, '??/??/' - это один символ, обратная косая черта).

орграфах

C99

В 1994 году были предоставлены более читаемые альтернативы пяти триграфам. Они используют только два символа и называются орграфами. В отличие от триграфов, орграфы - это жетоны. Если орграф встречается в другом токене (например, строковые литералы или символьные константы), то он не будет рассматриваться как орграф, но останется таким, каким он есть.

Ниже показано различие до и после обработки орграфа последовательности.

#include <stdio.h>

int main()
<%
    printf("Hello %> World!\n"); /* Note that the string contains a digraph */
%>

Которые будут обрабатываться так же, как:

#include <stdio.h>

int main()
{
    printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
диграф эквивалент
<: [
:> ]
<% {
%> }
%: #


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow