C Language
Volgorde van meerdere tekens
Zoeken…
Opmerkingen
Niet alle preprocessors ondersteunen trigraph-sequentieverwerking. Sommige compilers geven een extra optie of schakelen om ze te verwerken. Anderen gebruiken een apart programma om trigraphs te converteren.
De GCC-compiler herkent ze niet tenzij u hier expliciet om vraagt (gebruik -trigraphs
om ze in te schakelen; gebruik -Wtrigraphs
, onderdeel van -Wall
, om waarschuwingen over -Wall
te krijgen).
Aangezien de meeste platforms die tegenwoordig worden gebruikt, het volledige bereik van enkele tekens ondersteunen die in C worden gebruikt, hebben digraphs de voorkeur boven trigraphs, maar het gebruik van alle reeksen met meerdere tekens wordt over het algemeen afgeraden.
Pas ook op voor onbedoeld trigraph-gebruik ( puts("What happened??!!");
bijvoorbeeld).
Trigraphs
De symbolen [ ] { } ^ \ | ~ #
worden vaak gebruikt in C-programma's, maar eind jaren tachtig waren er codesets in gebruik (ISO 646-varianten, bijvoorbeeld in Scandinavische landen), waar de ASCII-tekenposities hiervoor werden gebruikt voor karakters van de nationale taalvarianten (bijv. £
voor #
in het VK; Æ Å æ å ø Ø
voor { } { } | \
in Denemarken; er was geen ~
in EBCDIC). Dit betekende dat het moeilijk was om C-code te schrijven op machines die deze sets gebruikten.
Om dit probleem op te lossen, stelde de C-standaard het gebruik van combinaties van drie tekens voor om een enkel teken te produceren dat een trigraph wordt genoemd. Een trigraph is een reeks van drie karakters, waarvan de eerste twee vraagtekens zijn.
Het volgende is een eenvoudig voorbeeld dat trigraph-reeksen gebruikt in plaats van #
, {
en }
:
??=include <stdio.h>
int main()
??<
printf("Hello World!\n");
??>
Dit wordt door de C-preprocessor gewijzigd door de trigraphs te vervangen door hun equivalenten van één teken alsof de code is geschreven:
#include <stdio.h>
int main()
{
printf("Hello World!\n");
}
TRIGRAPH | Gelijkwaardig |
---|---|
= ?? | # |
?? / | \ |
??' | ^ |
?? ( | [ |
??) | ] |
??! | | |
?? < | { |
??> | } |
?? - | ~ |
Merk op dat trigraphs problematisch zijn, omdat bijvoorbeeld ??/
een backslash is en de betekenis van vervolgregels in opmerkingen kan beïnvloeden en moet worden herkend in tekenreeksen en letterlijke lettertekens (bijvoorbeeld '??/??/'
is een enkele karakter, een backslash).
digraphs
In 1994 werden meer leesbare alternatieven voor vijf van de trigrafen geleverd. Deze gebruiken slechts twee tekens en staan bekend als digraphs. In tegenstelling tot trigraphs zijn digraphs tokens. Als een digraph in een ander token voorkomt (bijvoorbeeld tekenreeksliteralen of tekenconstanten), wordt deze niet als een digraph behandeld, maar blijft hij zoals hij is.
Hieronder ziet u het verschil voor en na het verwerken van de reeks digraphs.
#include <stdio.h>
int main()
<%
printf("Hello %> World!\n"); /* Note that the string contains a digraph */
%>
Die hetzelfde worden behandeld als:
#include <stdio.h>
int main()
{
printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
Digraaf | Gelijkwaardig |
---|---|
<: | [ |
> | ] |
<% | { |
%> | } |
%: | # |