Gemäß C ++ '03 Standard 2.3 / 1:
Bevor eine andere Verarbeitung stattfindet, wird jedes Auftreten einer der folgenden Sequenzen von drei Zeichen ("Trigraphsequenzen") durch das in Tabelle 1 angegebene Einzelzeichen ersetzt.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
Im wirklichen Leben bedeutet dies, dass Code zum printf( "What??!\n" );
Drucken führt, What|
da ??!
es sich um eine Trigraphsequenz handelt, die durch das |
Zeichen ersetzt wird.
Meine Frage ist, welchen Zweck die Verwendung von Trigraphen hat. Gibt es einen praktischen Vorteil bei der Verwendung von Trigraphen?
UPD : In den Antworten wurde erwähnt, dass einige europäische Tastaturen nicht alle Satzzeichen haben, so dass Nicht-US-Programmierer im Alltag Trigraphen verwenden müssen.
UPD2 : In Visual Studio 2010 ist die Trigraph-Unterstützung standardmäßig deaktiviert .
Antworten:
Diese Frage (über die eng verwandten Digraphen) hat die Antwort.
Es läuft darauf hinaus, dass der ISO 646-Zeichensatz nicht alle Zeichen der C-Syntax enthält. Daher gibt es einige Systeme mit Tastaturen und Anzeigen, die mit den Zeichen nicht umgehen können (obwohl ich mir vorstelle, dass diese recht selten sind heutzutage).
Im Allgemeinen müssen Sie sie nicht verwenden, aber Sie müssen sie genau kennen, um das Problem zu lösen, auf das Sie gestoßen sind. Trigraphen sind der Grund, warum das
?
Zeichen ' ' eine Escape-Sequenz hat:So können Sie Ihr Beispielproblem auf folgende Weise vermeiden:
Aber Sie müssen sich daran erinnern, wenn Sie die beiden '?' Zeichen, mit denen Sie möglicherweise einen Trigraph beginnen (und an die ich sicherlich nie denke).
In der Praxis sind Trigraphen und Digraphen etwas, worüber ich mir im Alltag überhaupt keine Sorgen mache. Aber Sie sollten sich ihrer bewusst sein, denn alle paar Jahre werden Sie auf einen Fehler stoßen, der mit ihnen zusammenhängt (und Sie werden den Rest des Tages damit verbringen, ihre Existenz zu verfluchen). Es wäre schön, wenn Compiler so konfiguriert werden könnten, dass sie warnen (oder Fehler verursachen), wenn sie auf einen Trigraph oder Digraph stoßen, damit ich weiß, dass ich etwas habe, mit dem ich mich wissentlich befassen sollte.
Und der Vollständigkeit halber sind Digraphen viel weniger gefährlich, da sie als Token verarbeitet werden, sodass ein Digraph in einem String-Literal nicht als Digraph interpretiert wird.
Werfen Sie einen Blick auf Herb Sutters GOTW # 86-Artikel , um eine gute Einführung in verschiedene Themen mit Interpunktion in C / C ++ - Programmen zu erhalten (einschließlich eines Trigraph-Fehlers, der mich definitiv dazu bringen würde, mir die Haare auszureißen) .
Nachtrag:
Es sieht so aus, als würde GCC Trigraphen standardmäßig nicht verarbeiten (und davor warnen). Einige andere Compiler haben Optionen zum Deaktivieren der Trigraph-Unterstützung (z. B. IBMs). Microsoft hat damit begonnen, eine Warnung (C4837) in VS2008 zu unterstützen, die explizit aktiviert werden muss (mithilfe von -Wall oder Ähnlichem).
quelle
Kinder heute! :-)
Ja, ausländische Geräte wie ein IBM 3270-Terminal. Der 3270 hat, wenn ich mich recht erinnere, keine geschweiften Klammern! Wenn Sie schreiben C auf einem IBM - mini / Mainframe wollten, Sie mußten die elende trigraphs für jede Blockgrenze verwenden. Glücklicherweise musste ich nur Software in C schreiben, um einige IBM Minicomputer-Funktionen zu emulieren , und keine C-Software auf dem System / 36 schreiben .
Schauen Sie neben der Taste "P" nach:
Hmmm. Schwer zu erzählen. Es gibt einen zusätzlichen Knopf neben "Wagenrücklauf", und ich könnte ihn rückwärts haben: Vielleicht fehlte das Paar "[" / "]". Auf jeden Fall würde diese Tastatur Ihnen Kummer bereiten, wenn Sie C schreiben müssten.
Außerdem zeigen diese Terminals EBCDIC an, den "nativen" Mainframe-Zeichensatz von IBM, nicht ASCII (danke, Pavel Minaev, für die Erinnerung).
Auf der anderen Seite, wie der GNU C-Leitfaden sagt: "Sie brauchen diesen Hirnschaden nicht." Der gcc-Compiler lässt diese "Funktion" standardmäßig deaktiviert.
quelle
Aus der
The C++ Programming Language
Special Edition, Seite 829quelle
`
, der im italienischen und mehreren anderen Tastaturlayouts fehltSie sind für Systeme vorgesehen, denen einige der Zeichen im grundlegenden Zeichensatz von C ++ fehlen. Selbstverständlich sind solche Systeme äußerst selten.
quelle
Trigraphen wurden zum Entfernen in C ++ 0x vorgeschlagen. Trotzdem scheint es immer noch starke Argumente dafür zu geben - siehe C ++ - Ausschusspapier N2910, in dem dies erörtert wird. Anscheinend ist EBCDIC eine wichtige Hochburg, in der sie gebraucht werden.
quelle
Ich habe Trigraphs gesehen, die in den frühen 90ern verwendet wurden, um PL / 1-Programme von einem Mainframe zu konvertieren, der auf einem PC ausgeführt / kompiliert / debuggt werden soll.
Sie beschäftigten sich mit der Bearbeitung von PL / I auf dem PC mit einem PL / I-zu-C-Compiler und wollten, dass der Code funktioniert, wenn er zurück zum Mainframe verschoben wird, der keine geschweiften Klammern unterstützt. Ich schlug vor, dass sie Makros wie verwenden könnten
oder als freundlichere PL / I-Alternative
und wenn sie wirklich Lust haben wollten, konnten sie es versuchen
und dann würde das Programm so aussehen, als wäre es in Pascal geschrieben worden. Sie sahen mich nur lustig an und sprachen für den Rest des Tages nicht mit mir. Ich glaube nicht, dass ich ihnen die Schuld gebe. :) :)
Was die Mühe tötete, was nicht die Tri-Graphen, waren die Unterschiede im E / A-System zwischen den Plattformen. Das Öffnen von Dateien auf dem PC war so anders als der Mainframe, dass viel zu viele Kludges eingeführt worden wären, um auf beiden den gleichen Code laufen zu lassen.
quelle
In erster Linie, weil der C-Standard sie 1989 einführte, als es Probleme mit dem Vorhandensein der Zeichen gab, denen Trigraphs auf einigen Maschinen zugeordnet sind. Zum Zeitpunkt der Veröffentlichung des C ++ - Standards im Jahr 1998 war der Bedarf an Trigraphen nicht groß. Sie sind eine Warze auf C; Sie sind genauso eine Warze in C ++. Sie wurden benötigt - insbesondere außerhalb der englischsprachigen Welt - weshalb sie zu C. hinzugefügt wurden.
quelle
Einige europäische Tastaturen haben nicht alle Interpunktionszeichen, die US-Tastaturen hatten (nicht?), Weil sie die Tasten für ihre ungewöhnlichen alphabetischen Zeichen benötigten. So hätte zum Beispiel die schwedische Tastatur einen A-Ring, wo sich die geschweifte Klammer befand.
Um diesen Benutzern gerecht zu werden, können Trigraphen die Interpunktion nur mit den gängigsten ASCII-Zeichen eingeben.
quelle
Sie sind meist aus historischen Gründen dort. Heutzutage ermöglichen die meisten modernen Tastaturen für die meisten Sprachen den Zugriff auf all diese Zeichen, aber dies war früher bei einigen europäischen Tastaturen ein Problem. Deshalb wurden Trigraphen erfunden.
Wenn Sie nicht wissen, wofür sie sind, sollten Sie sie nicht verwenden.
Es ist jedoch immer noch gut, sich ihrer bewusst zu sein, da Sie möglicherweise versehentlich und unbeabsichtigt eine in Ihrem Code verwenden.
quelle