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.
Es ist fast Weihnachten, so würde Smileys mit Bärten traurig sein. – rightfold
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. –
@BenjaminGruenbaum Soweit ich weiß, werden sie komplett in C++ 17 – Xeo