C Language
Zeichenfolge mit mehreren Zeichen
Suche…
Bemerkungen
Nicht alle Präprozessoren unterstützen die Verarbeitung von Trigrafesequenzen. Einige Compiler geben eine zusätzliche Option oder einen Schalter für die Verarbeitung an. Andere verwenden ein separates Programm, um Trigrafien zu konvertieren.
Der GCC Compiler erkennt sie nicht , wenn Sie es explizit anfordern so (Verwendung tun -trigraphs
ihnen zu ermöglichen, verwenden -Wtrigraphs
, Teil -Wall
, Warnungen über trigraphs zu bekommen).
Da die meisten heute verwendeten Plattformen den gesamten Bereich der in C verwendeten Einzelzeichen unterstützen, werden Digraphen gegenüber Trigraphen bevorzugt, aber die Verwendung beliebiger Zeichenfolgen mit mehreren Zeichen wird im Allgemeinen nicht empfohlen.
Hüten Sie sich auch vor versehentlichem Trigraph-Gebrauch (zB puts("What happened??!!");
Trigraphen
Die Symbole [ ] { } ^ \ | ~ #
werden häufig in C-Programmen verwendet. In den späten 1980er Jahren wurden jedoch Codesätze verwendet (ISO 646-Varianten, z. B. in skandinavischen Ländern), bei denen die ASCII-Zeichenpositionen für landessprachige Varianten (z. B. £
für #
in Großbritannien; Æ Å æ å ø Ø
für { } { } | \
in Dänemark; in EBCDIC gab es kein ~
). Dies bedeutete, dass es schwierig war, C-Code auf Maschinen zu schreiben, die diese Sets verwendeten.
Um dieses Problem zu lösen, schlug der C-Standard die Verwendung von Kombinationen von drei Zeichen vor, um ein einzelnes Zeichen zu erzeugen, das als Trigraph bezeichnet wird. Ein Trigraph ist eine Folge von drei Zeichen, von denen die ersten beiden Fragezeichen sind.
Das folgende ist ein einfaches Beispiel, das Trigrafesequenzen anstelle von #
, {
und }
:
??=include <stdio.h>
int main()
??<
printf("Hello World!\n");
??>
Dies wird vom C-Präprozessor geändert, indem die Trigraphen durch ihre Einzelzeichen-Äquivalente ersetzt werden, als ob der Code geschrieben worden wäre:
#include <stdio.h>
int main()
{
printf("Hello World!\n");
}
Trigraph | Äquivalent |
---|---|
?? = | # |
?? | \ |
?? ' | ^ |
?? ( | [ |
??) | ] |
??! | | |
?? < | { |
??> | } |
?? - | ~ |
Beachten Sie, dass Trigraphen problematisch sind, weil z. B. ??/
ein Backslash ist und die Bedeutung von Fortsetzungszeilen in Kommentaren beeinflussen kann und in Zeichenfolgen und Zeichenliteralen erkannt werden muss (z. B. '??/??/'
ist eine einzige Zeichen, ein Backslash).
Digraphen
1994 wurden besser lesbare Alternativen zu fünf der Trigraphen geliefert. Diese verwenden nur zwei Zeichen und werden als Digraphen bezeichnet. Im Gegensatz zu Trigraphen sind Digraphen Marken. Wenn ein Digraph in einem anderen Token vorkommt (z. B. Zeichenfolgenliterale oder Zeichenkonstanten), wird er nicht als Digraph behandelt, sondern bleibt unverändert.
Das Folgende zeigt den Unterschied vor und nach der Verarbeitung der Digraphenfolge.
#include <stdio.h>
int main()
<%
printf("Hello %> World!\n"); /* Note that the string contains a digraph */
%>
Die werden gleich behandelt wie:
#include <stdio.h>
int main()
{
printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
Digraph | Äquivalent |
---|---|
<: | [ |
:> | ] |
<% | { |
%> | } |
%: | # |