Szukaj…


Uwagi

Nie wszystkie preprocesory obsługują przetwarzanie sekwencji trygraficznych. Niektóre kompilatory dają dodatkową opcję lub przełącznik ich przetwarzania. Inni używają osobnego programu do konwersji kaligrafii.

Kompilator GCC nie rozpoznaje ich, chyba że wyraźnie o to -trigraphs (użyj -trigraphs aby je włączyć; użyj -Wtrigraphs , część -Wall , aby uzyskać ostrzeżenia o trigrafach).

Ponieważ większość obecnie używanych platform obsługuje pełny zakres pojedynczych znaków używanych w C, digrafy są bardziej preferowane niż trygrafy, ale generalnie odradza się stosowanie dowolnych wieloznakowych sekwencji znaków.

Uważaj też na przypadkowe użycie kaligrafii ( puts("What happened??!!"); na przykład).

Trygrysy

Symbole [ ] { } ^ \ | ~ # są często używane w programach C, ale pod koniec lat 80. były w użyciu zestawy kodów (warianty ISO 646, na przykład w krajach skandynawskich), w których pozycje znaków ASCII dla nich były używane dla znaków wariantów języka narodowego (np. £ dla # w Wielkiej Brytanii; Æ Å æ å ø Ø dla { } { } | \ w Danii; nie było ~ w EBCDIC). Oznaczało to, że trudno było napisać kod C na komputerach, które korzystały z tych zestawów.

Aby rozwiązać ten problem, standard C zasugerował użycie kombinacji trzech znaków do wytworzenia jednego znaku zwanego trigrafią. Trigraf to ciąg trzech znaków, z których pierwsze dwa to znaki zapytania.

Poniżej znajduje się prosty przykład, który używa sekwencji trigraficznych zamiast # , { i } :

??=include <stdio.h>

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

Zostanie to zmienione przez preprocesor C, zastępując trygrafy ich jednoznakowymi odpowiednikami, tak jakby kod został napisany:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
}
Kaligrafia Odpowiednik
?? = #
?? / \
?? ^
?? ( [
??) ]
?? |
?? < {
??> }
?? - ~

Zauważ, że trygrafy są problematyczne, ponieważ na przykład ??/ jest odwrotnym ukośnikiem i może wpływać na znaczenie linii kontynuacji w komentarzach i muszą być rozpoznawane w ciągach znaków i literałach znaków (np. '??/??/' jest pojedynczym znak, odwrotny ukośnik).

Digraphs

C99

W 1994 r. Dostarczono bardziej czytelne alternatywy dla pięciu trigrafów. Używają tylko dwóch znaków i są znane jako digrafy. W przeciwieństwie do trigrafów, digrafy są tokenami. Jeśli digraf występuje w innym tokenie (np. Literałach łańcuchowych lub stałych znakowych), nie będzie traktowany jak digraf, ale pozostanie taki, jaki jest.

Poniżej pokazano różnicę przed i po przetworzeniu sekwencji digrafów.

#include <stdio.h>

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

Które będą traktowane tak samo jak:

#include <stdio.h>

int main()
{
    printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
Dwuznak Odpowiednik
<: [
:> ]
<% {
%> }
%: #


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow