2014-12-22 10 views
18

C++ 1z wird Trigraphen entfernen. IBM widersetzte sich stark (here und here), so scheint es Argumente für beide Seiten der Entfernung/nicht Entfernung zu geben.C++ 1z warum nicht Digraphen zusammen mit Trigraphen entfernen?

Aber seit die Entscheidung getroffen wurde, Trigraphen zu entfernen, warum Digraphen verlassen? Ich sehe keine Gründe dafür, Digraphen über die Gründe hinaus zu behalten, Trigraphen zu behalten (die anscheinend nicht genug Gewicht hatten, um sie zu halten).

+13

Es ist fast Weihnachten, so würde Smileys mit Bärten traurig sein. – rightfold

+1

Beachten Sie, dass Trigraphen _deprecated_ und nicht _removed_ sind. Ich denke, dass die Idee ist, Leute, die sie benutzen, dazu zu bringen, sie nicht mehr in neuem Code zu verwenden und Entwickler mit altem Code dazu zu bringen, irgendwann zu migrieren. Sie werden keinen Code brechen - was den Grund betrifft: Es ist nur eine andere Art, dasselbe zu tun, was die Sprache nur ein kleines bisschen größer und verwirrender macht. –

+0

@BenjaminGruenbaum Soweit ich weiß, werden sie komplett in C++ 17 – Xeo

Antwort

27

Trigraphs sind für den ahnungslosen Benutzer problematischer als Digraphen. Dies liegt daran, dass sie in Zeichenfolgenliteralen und Kommentaren ersetzt werden. Hier sind einige Beispiele ...

Beispiel A:

std::string example = "What??!??!"; 
std::cout << example << std::endl; 

What|| wird auf der Konsole ausgegeben werden. Dies ist wegen der Trigraph ??! wird übersetzt in |.

Beispiel B:

// Error ?!?!?!??!??/ 
std::cout << "There was an error!" << std::end; 

Nichts wird überhaupt passieren. Dies liegt daran, dass ??/ in \ übersetzt wird. Dadurch wird das Zeilenumbruchzeichen entfernt und die nächste Zeile wird auskommentiert.

Beispiel C:

// This makes no sense ?!?!!?!??!??/ 
std::string example = "Hello World"; 
std::cout << example << std::endl; 

Dies wird einen Fehler nach dem Vorbild der use of undeclared identifier "example" aus den gleichen Gründen wie in Beispiel B.

Es gibt viele aufwendigere Probleme trigraphs geben verursachen können, aber Du hast die Idee. Es ist erwähnenswert, dass viele Compiler tatsächlich eine Warnung ausgeben, wenn solche Übersetzungen gemacht werden; Ein weiterer Grund, Warnungen immer als Fehler zu behandeln. Dies ist jedoch in der Norm nicht erforderlich und daher nicht zuverlässig.

Digraphen sind viel weniger problematisch als Trigraphs, da sie nicht in einem anderen Token (d. H. Einem String oder Zeichenliteral) ersetzt werden und keine Sequenz in \ übersetzt wird, so dass neue Zeilen in Kommentaren nicht vorkommen können.

Fazit

Anders als schwieriger Code zu lesen, gibt es weniger Probleme durch Digraphe verursacht und damit die Notwendigkeit, sie zu entfernen ist stark reduziert.