Warum erzeugen Trigraphen Fehler in modernen C ++ Compilern?

8

Selbst in den GCC-Compilern werden die Trigraphen nicht kompiliert, ohne das Trigraph-Attribut explizit anzugeben.

%Vor%

Dieses als try.c gespeicherte Programm wird nur dann im GCC-Compiler kompiliert, wenn wir gcc -Wall -trigraphs try.c angeben und es weiterhin Warnungen anzeigt. Können Sie einige Compiler anwerben, die Trigraphen ohne Fehler oder Warnungen behandeln und behandeln?

    
Praveen Vinny 29.11.2012, 05:35
quelle

4 Antworten

9

Durch den ANSI C-Standard von 1989 wurden Trigagramme eingeführt und in allen späteren C-Standards beibehalten. Sie erscheinen auch im ersten ISO C ++ - Standard, der 1998 veröffentlicht wurde, und in allen späteren C ++ - Standards bis C ++ 14. (Trigraphs werden in C ++ 17 entfernt. Danke an Jonathan Leffler und dyp für das Aufspüren der Details.)

Sie sind keine optionale Funktion in beiden Sprachen. alle entsprechenden Compiler müssen sie unterstützen und entsprechend dem jeweiligen Sprachstandard interpretieren.

Zum Beispiel, wenn dieses Programm:

%Vor%

druckt oops , dann ist Ihr Compiler nicht konform.

Aber viele, vielleicht die meisten C-Compiler passen sich nicht standardmäßig vollständig an. Solange ein Compiler in irgendeiner Weise dem Standard entsprechen kann, ist das für den Standard gut genug. (gcc benötigt -pedantic und -std=... , um dies zu tun.)

Aber selbst wenn ein Compiler vollständig konform ist, gibt es im Standard nichts, was verbietet, dass ein Compiler vor etwas warnt, das er mag. Ein konformer C-Compiler muss jede Verletzung einer Syntaxregel oder -beschränkung diagnostizieren, aber er kann so viele zusätzliche Warnungen ausgeben, wie er möchte - und er muss nicht zwischen erforderlichen Diagnosen und anderen Warnungen unterscheiden.

Trigramme werden sehr selten benutzt. Die überwiegende Mehrheit der Entwicklungssysteme unterstützt direkt alle Zeichen, für die Trigraphs substituieren: # , [ , \ , ] , ^ , { , | , } , ~ .

Es ist wahrscheinlich, dass Trigraphs versehentlich häufiger verwendet werden als sie richtig verwendet werden:

%Vor%

Warnung vor Trigraphs, die die Bedeutung eines Programms verändern könnten (relativ zu der Bedeutung, die es hätte, wenn die Sprache keine Trigraphs hätte), ist sowohl durch den ISO-Standard als auch durch IMHO vollkommen vernünftig. Die meisten Compiler haben wahrscheinlich Optionen, um solche Warnungen zu deaktivieren.

Umgekehrt wäre es für einen C ++ 17-Compiler, der nicht Trigraphs implementiert, sinnvoll, vor Sequenzen zu warnen, die in C ++ 14 oder früher als Trigraphs behandelt worden wären. Auch hier wäre eine Option zum Deaktivieren solcher Warnungen eine gute Sache.

    
Keith Thompson 02.12.2012, 08:33
quelle
5

GCC ist allergisch gegen Trigraphs. Sie müssen sie explizit aktivieren:

%Vor%

Das GCC 4.7.1 Handbuch sagt:

  

-trigraphs

     

Unterstützt ISO C-Trigraphs. Die Optionen -ansi (und -std für striktes ISO   C-Konformität) impliziert -trigraphs .

Es sagt auch:

  

-Wtrigraphs

     

Warne, wenn irgendwelche Trigraphs gefunden werden, die die Bedeutung des   Programm (Trigraphen innerhalb von Kommentaren werden nicht gewarnt). Diese Warnung ist   aktiviert von -Wall .

    
Jonathan Leffler 29.11.2012 05:43
quelle
2

Sie sind möglicherweise standardmäßig deaktiviert .

"Einige Compiler unterstützen eine Option, um die Erkennung von Trigraphen zu deaktivieren oder Trigraphen standardmäßig zu deaktivieren und erfordern eine Option, um sie zu aktivieren"

GCC könnte einer der Letzteren sein . Es sollte zwar standardmäßig mit Warnung ignorieren , aber in diesem Fall könnte das Ignorieren verursacht den Kompilierfehler

    
Karthik T 29.11.2012 05:39
quelle
1

Trigramme werden zu einem sehr frühen Zeitpunkt der Kompilierung konvertiert und können sogar in Zeichenfolgenliteralen ersetzt werden. Dies macht Fehler, die sich aus Trigraph-Übersetzungen ergeben, sehr schwer zu erkennen (am schlechtesten, wenn Sie das Debugging mit einem Protokoll durchführen und die Ausgabe in Ihrer Quelle finden).

Die Warnung, die Sie sehen, hilft Ihnen, einen möglichen Täter schnell zu finden, um die Quelle des Fehlers zu verfolgen. Grundsätzlich ist es Warnung Sie, dass etwas nicht so sein könnte, wie Sie es für richtig halten.

    
Neowizard 29.11.2012 05:59
quelle

Tags und Links