Frage

Nach C ++ 03 Standard-2.3 / 1:

  

Bevor eine andere Verarbeitung stattfindet, jedes Vorkommen von einem der folgenden Sequenzen von drei Zeichen ( „trigraph sequences“) durch die einzelne Zeichen in der Tabelle 1 angegeben ersetzt

----------------------------------------------------------------------------
| trigraph | replacement | trigraph | replacement | trigraph | replacement |
----------------------------------------------------------------------------
| ??=      | #           | ??(      | [           | ??<      | {           |
| ??/      | \           | ??)      | ]           | ??>      | }           |
| ??’      | ˆ           | ??!      | |           | ??-      | ˜           |
----------------------------------------------------------------------------

Im wirklichen Leben, das bedeutet, dass Code printf( "What??!\n" ); in Druck What| führen wird, weil ??! eine trigraph Sequenz ist, die mit dem | Zeichen ersetzt wird.

Meine Frage ist, was Zweck trigraphs zu verwenden? Gibt es einen praktischen Vorteil trigraphs abarbeitet?

UPD : In Antworten wurde erwähnt, dass einige europäische Tastaturen nicht alle Satzzeichen, also Nicht-US-Programmierer haben trigraphs im Alltag verwenden

UPD2 :. Visual Studio 2010 hat trigraph Unterstützung standardmäßig deaktiviert

War es hilfreich?

Lösung

Diese Frage (über die eng verwandten Digraphe) hat die Antwort.

Es läuft darauf hinaus auf die Tatsache, dass die ISO 646 Zeichensatz nicht alle Zeichen der C-Syntax hat, so gibt es einige Systeme mit Tastaturen und Displays, die nicht mit den Charakteren umgehen kann (obwohl ich, dass diese vorstellen sind sehr selten heutzutage).

In der Regel brauchen Sie nicht, sie zu benutzen, aber Sie müssen über sie wissen genau das Problem, das Sie in lief. Trigraphs ist der Grund, den der ‚?‘ Charakter eine Escape-Sequenz hat:

'\?'

So ein paar Möglichkeiten, wie Sie Ihr Beispiel Problem vermeiden können, sind:

 printf( "What?\?!\n" ); 

 printf( "What?" "?!\n" ); 

Aber Sie müssen bedenken, wenn Sie die beiden sind Eingabe von ‚?‘ Zeichen, dass Sie einen trigraph beginnen (und es ist sicherlich nicht etwas, was ich denke).

In der Praxis trigraphs und Digraphen sind etwas, was mich Basis nicht über überhaupt an einem Tag zu Tag kümmern. Aber Sie sollten sich bewusst von ihnen sein, weil einmal alle paar Jahre, die Sie in einen Fehler im Zusammenhang mit ihnen laufen werden (und Sie werden den Rest des Tages zu verfluchen ihre Existenz verbringen). Es wäre schön, wenn Compiler konfiguriert werden könnte, warnen (oder Fehler), wenn er über einen trigraph oder digraph kommt, so konnte ich weiß, dass ich etwas habe sollte ich wissentlich beschäftigen.

Und nur der Vollständigkeit halber, sind Digraphe viel weniger gefährlich, da sie als Token verarbeitet bekommen, so ein Digraph in einem Stringliteral nicht als digraph interpretiert erhalten.

Für eine schöne Ausbildung auf verschiedenen Spaß mit Interpunktion in C / C ++ Programmen (einschließlich einem trigraph Fehler, der defintinely ich meine Haare hätte herausziehen), werfen Sie einen Blick auf Herb Sutter GOTW # 86 Artikel .


Nachtrag:

Es sieht aus wie GCC nicht Prozess trigraphs standardmäßig (und wird warnen). Einige andere Compiler haben Optionen trigraph Unterstützung (IBM zum Beispiel) deaktivieren. Microsoft startete eine Warnung (C4837) in VS2008 unterstützt, die explizit aktiviert werden muss (-Wall oder etwas verwenden).

Andere Tipps

Von The C++ Programming Language Special Edition, Seite 829

  

Die ASCII Sonderzeichen [, ], {, }, | und \ besetzen Positionen Zeichensatz als alphabetisch nach ISO bezeichnet. In den meisten europäischen nationalen ISO-646-Zeichensätzen werden diese Positionen mit Buchstaben belegt nicht im englischen Alphabet gefunden.

     

Eine Reihe von trigraphs vorgesehen nationalen Zeichen zu ermöglichen, in einer tragbaren Weise ausgedrückt werden, um einen wirklich Standard minimal-Zeichensatz verwendet. Dies kann für den Austausch von Programmen nützlich sein, aber es macht es nicht einfacher für Menschen Programme zu lesen. Natürlich ist die langfristige Lösung für dieses Problem ist für C ++ Programmierer Ausrüstung zu erhalten, das sowohl ihre Muttersprache und C ++ gut unterstützt. Leider scheint dies für einige nicht machbar zu sein, und die Einführung neuer Geräte kann ein frustrierenden langsamer Prozess sein.

Kinder heute! : -)

Ja, fremde Geräte, wie zum Beispiel eines IBM 3270-Terminal. Die 3270 hat, wenn ich mich erinnere, keine geschweiften Klammern! Wenn Sie C auf einem IBM-mini / Mainframe schreiben wollte, Sie musste die elenden trigraphs für jede Blockgrenze verwenden. Glücklicherweise hatte ich nur Software in C schreiben emulieren einige IBM Minicomputer Einrichtungen, nicht wirklich C Software auf das System / 36.

schreiben

Schauen Sie neben der Taste "P":

Hmmm. Schwer zu erzählen. Es gibt eine extra Taste neben „Wagenrücklauf“, und ich kann es nach hinten hat: vielleicht ist es das „[“ / „]“ war Paar, das fehlte. Jedenfalls ist diese Tastatur verursachen würde man Trauer, wenn Sie C schreiben hatte.

Auch diese Terminals Anzeige EBCDIC, IBMs "native" Mainframe-Zeichensatz, nicht ASCII (danke, Pavel Minaev, für die Erinnerung).

Auf der anderen Seite, wie der GNU C Guide sagt: „Sie haben nicht diese Hirnschäden müssen.“ Der gcc-Compiler lässt dieses "Feature" standardmäßig deaktiviert.

Sie sind für den Einsatz auf Systemen, die einige der Zeichen in C ++ 's Grundzeichensatz fehlt. Unnötig zu sagen, sind solche Systeme äußerst selten.

Trigraphen wurde für die Entfernung in C ++ 0x vorgeschlagen. Das heißt, es scheint immer noch starkes Argument zur Unterstützung von ihnen zu sein - siehe C ++ Komitee Papier N2910 , die diskutiert diese. Offenbar EBCDIC ist einer der Hauptburg, wo sie gebraucht werden.

Ich habe trigraphs in den frühen 90er Jahren verwendet, gesehen zu helfen, PL / 1-Programme von einem Mainframe konvertiert auf einem PC laufen / kompilierte / debuggt werden.

Sie wurden Dilettantismus mit der Bearbeitung von PL / I auf dem PC ein PL / I an C-Compiler und sie wollten den Code, wenn wieder auf das Mainframe bewegt arbeiten, die nicht geschweiften Klammern unterstützt haben. Ich schlug vor, dass sie Makros wie

verwenden könnte
#def BEGIN {    
#def END }  

oder als freundliche PL / I Alternative

#def BEGIN ??<
#def END ??>

und wenn sie wollten wirklich Lust bekommen sie könnten versuchen,

#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif

und dann würde das Programm aussehen, wie es in Pascal geschrieben wurde. Sie sah mich nur an lustig und würde mir nicht für den Rest des Tages sprechen. Ich glaube nicht, dass ich es ihnen verdenken. :)

Was den Aufwand getötet, was nicht die Tri-Grafiken, es die IO-System Unterschiede zwischen den Plattformen war. Das Öffnen von Dateien auf dem PC wurde so viel anders als der Mainframe es viel zu viele kludges eingeführt hätte auf beiden den gleichen Code sicher zu halten.

Einige europäische Tastaturen nicht (nicht?) Haben alle Satzzeichen, die US-Tastaturen hatte, weil sie die Schlüssel, die für ihre ungewöhnlichen Buchstaben. So zum Beispiel (so dass diese nach oben), müßte die schwedische Tastatur A-Ring, wo die geschweifte Klammer war.

die Benutzer einen Urlaub sind trigraphs ein Weg Interpunktion eingeben nur die am häufigsten verwendeten ASCII-Zeichen verwendet wird.

In erster Linie, weil der C-Standard eingeführt sie im Jahr 1989 zurück, als es Probleme mit der Anwesenheit der Charaktere waren, die Karte auf einigen Maschinen Trigraphen. Durch die Zeit, die C ++ Standard im Jahr 1998 veröffentlicht wurde, war die Notwendigkeit für trigraphs nicht groß. Sie sind eine Warze auf C; sie sind ebenso eine Warze auf C ++. Es gab eine Notwendigkeit für sie - vor allem außerhalb der englischsprachigen Welt -., Weshalb sie zu C hinzugefügt wurden

Sie sind dort vor allem aus historischen Gründen. Heutzutage sind die meisten modernen Tastaturen für die meisten Sprachen erlauben den Zugriff auf alle diese Zeichen, aber diese verwendet, um ein Problem einmal mit einigen europäischen Tastaturen zu sein. Aus diesem Grund trigraphs erfunden wurden.

Wenn Sie nicht wissen, was sie für, sollten Sie sie nicht benutzen.

Es ist immer noch gut bewusst von ihnen zu sein, obwohl, da Sie versehentlich könnte und unbeabsichtigt in Ihrem Code verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top