Sök…


Anmärkningar

Inte alla förbehandlare stöder behandling av trigrafesekvens. Vissa kompilatorer ger ett extra alternativ eller switch för att bearbeta dem. Andra använder ett separat program för att konvertera trigrafer.

GCC-kompilatorn känner inte igen dem om du inte uttryckligen begär den att göra det (använd -trigraphs att aktivera dem; använd -Wtrigraphs , en del av -Wall , för att få varningar om trigrafer).

Eftersom de flesta plattformar som används idag stöder hela utbudet av enstaka tecken som används i C föredras digrafer framför trigrafer men användningen av alla karaktärsekvenser med flera karaktärer är generellt avskräckta.

Var också uppmärksam på oavsiktlig trigraph-användning ( puts("What happened??!!"); till exempel).

trigraphs

Symbolerna [ ] { } ^ \ | ~ # används ofta i C-program, men i slutet av 1980-talet användes koduppsättningar (ISO 646-varianter, till exempel i skandinaviska länder) där ASCII-karaktärspositionerna för dessa användes för tecken i nationella språkvarianter (t.ex. £ för # i Storbritannien; Æ Å æ å ø Ø för { } { } | \ i Danmark; det fanns ingen ~ i EBCDIC). Det innebar att det var svårt att skriva C-kod på maskiner som använde dessa uppsättningar.

För att lösa detta problem föreslog C-standarden att man använder kombinationer av tre tecken för att producera ett enda tecken som kallas en trigraf. En trigraf är en sekvens av tre tecken, varav de första två är frågetecken.

Följande är ett enkelt exempel som använder trigrafesekvenser istället för # , { och } :

??=include <stdio.h>

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

Detta kommer att ändras av C-förbehandlaren genom att byta ut trigraferna med deras enda teckenekvivalenter som om koden hade skrivits:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
}
Trigraph Likvärdig
?? = #
?? / \
??' ^
?? ( [
??) ]
??! |
?? < {
??> }
?? - ~

Observera att trigrafer är problematiska eftersom, till exempel, ??/ är ett bakslag och kan påverka betydelsen av fortsättningslinjer i kommentarer, och måste erkännas inuti strängar och teckenbokstäver (t.ex. '??/??/' är en enda karaktär, ett snedstreck).

digraphs

C99

1994 levererades mer läsbara alternativ till fem av trigraferna. Dessa använder bara två tecken och kallas digrafer. Till skillnad från trigrafer är digrafer symboler. Om en digraph inträffar i en annan token (t.ex. strängbokstäver eller karaktärskonstanter) kommer den inte att behandlas som en digraph, utan förblir som den är.

Följande visar skillnaden före och efter bearbetning av digrafsekvensen.

#include <stdio.h>

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

Vilket kommer att behandlas på samma sätt som:

#include <stdio.h>

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow