Cel sekwencji Trygrafu w C++?

Zgodnie ze standardem C++'03 2.3 / 1:

Przed jakimkolwiek innym przetworzeniem każde wystąpienie jednej z następujących sekwencji trzech znaków ("sekwencji trygrafu") zastępuje się pojedynczym znakiem wskazanym w tabeli 1.

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

W prawdziwym życiu oznacza to, że kod printf( "What??!\n" ); spowoduje wydrukowanie What|, ponieważ ??! jest sekwencją trygrafu, która jest zastąpiona znakiem |.

Moje pytanie brzmi w jakim celu używać trygrafy? czy jest jakaś praktyczna korzyść z używania trygrafów?

UPD: w odpowiedziach wspomniano, że niektóre europejskie klawiatury nie mają wszystkich znaków interpunkcyjnych, więc programiści spoza USA muszą używać trygrafów w życiu codziennym?

UPD2 : Visual Studio 2010 ma domyślnie wyłączoną obsługę trigraph.

Author: Kirill V. Lyadvinsky, 2009-08-05

9 answers

To pytanie (o blisko spokrewnionych digrafach) ma odpowiedź.

Sprowadza się to do tego, że zestaw znaków ISO 646 nie ma wszystkich znaków składni C, więc są pewne systemy z klawiaturami i wyświetlaczami, które nie radzą sobie ze znakami (chociaż wyobrażam sobie, że są to dość rzadkie w dzisiejszych czasach).

Ogólnie rzecz biorąc, nie musisz ich używać, ale musisz wiedzieć o nich dokładnie w przypadku problemu, na który natrafiłeś. Trygrafy są powodem znak '? ' ma sekwencję ucieczki:

'\?'

Więc kilka sposobów na uniknięcie przykładowego problemu to:

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

 printf( "What?" "?!\n" ); 
Ale musisz pamiętać, kiedy piszesz te dwa?"postacie, o których możesz zaczynać trygraf (a na pewno nigdy o tym nie myślę).

W praktyce, trygrafy i digrafy są czymś, o co nie martwię się na co dzień. Ale powinieneś być tego świadomy, ponieważ raz na kilka lat napotkasz na bug związany z nimi (i spędzisz resztę dnia przeklinając ich istnienie). Byłoby miło, gdyby Kompilatory mogły być skonfigurowane do ostrzegania (lub błędu), gdy natknie się na trygraf lub digraf, więc mogłem wiedzieć, że mam coś, z czym powinienem świadomie poradzić.

I tak dla kompletności, digrafy są znacznie mniej niebezpieczne, ponieważ są przetwarzane jako tokeny, więc digraf wewnątrz literału łańcuchowego nie będzie interpretowany jako digraf.

Za miłą edukację na różnych zabawach z interpunkcja w programach C / C++ (w tym błąd trigraphu, który zdecydowanie sprawiłby, że wyrwałbym sobie włosy), spójrz na herb Sutter ' s GOTW #86 article .


Dodatek:

Wygląda na to, że GCC domyślnie nie będzie przetwarzać (i ostrzegać) trigrafów. Niektóre inne Kompilatory mają opcje wyłączenia obsługi trigraphu (np. IBM). Microsoft zaczął wspierać Ostrzeżenie (C4837) w VS2008, które musi być jawnie włączone (używając-Wall czy coś).

 87
Author: Michael Burr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:26

From The C++ Programming Language Special Edition, page 829

Znaki specjalne ASCII [, ], {, }, |, i \ zajmują pozycje zestawów znaków wyznaczone jako Alfabetyczne przez ISO. W większości europejskich krajowych zestawów znaków ISO-646 pozycje te są zajęte przez litery nie występujące w alfabecie angielskim.

Dostarczany jest zestaw trygrafów, aby umożliwić wyrażanie znaków narodowych w przenośny sposób przy użyciu prawdziwie standardowego minimalnego zestawu znaków. Może to być przydatne do wymiany programów, ale nie ułatwia ludziom czytania programów. Oczywiście długoterminowym rozwiązaniem tego problemu jest dla programistów C++ uzyskanie sprzętu, który dobrze obsługuje zarówno ich język ojczysty, jak i C++. Niestety, dla niektórych wydaje się to niewykonalne, a wprowadzenie nowego sprzętu może być frustrująco powolnym procesem.

 20
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 17:19:42

Dzieci dzisiaj! :-)

Tak, zagraniczny sprzęt, taki jak Terminal IBM 3270. 3270 ma, o ile pamiętam, żadnych kręconych aparatów! Jeśli chcesz napisać C na IBM mini / mainframe, musisz użyć nędznych trygrafów dla każdej granicy bloku. Na szczęście musiałem tylko pisać oprogramowanie w języku C, Aby emulować niektóre urządzenia MINIKOMPUTEROWE IBM, a nie pisać oprogramowanie w języku C na System/36.

Spójrz obok "P" klucz: http://www.9999hp.net/keyboard/temp/1389260-big.jpg

Hmmm. Trudno powiedzieć. Jest dodatkowy przycisk obok "powrót karety" i mogę go mieć od tyłu: może to była para " [ " / " ]", której brakowało. W każdym razie ta klawiatura sprawiłaby Ci smutek, gdybyś musiał napisać C.

Również te terminale wyświetlają EBCDIC, "natywny" zestaw znaków mainframe IBM, a nie ASCII (dzięki, Pavel Minaev, za przypomnienie).

Z drugiej strony, jak GNU C przewodnik mówi: "nie potrzebujesz tego uszkodzenia mózgu."Kompilator gcc domyślnie pozostawia tę" funkcję " wyłączoną.

 18
Author: Roboprog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 17:54:46

Są używane w systemach, w których brakuje niektórych znaków w podstawowym zestawie znaków C++. Nie trzeba dodawać, że takie systemy są niezwykle rzadkie.

 13
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 17:18:10

Trygrafy zostały zaproponowane do usunięcia w C++0x. to powiedziawszy, nadal wydaje się być silny argument na ich poparcie - patrz artykuł Komitetu C++ N2910, który omawia ten temat. Najwyraźniej EBCDIC jest jedną z głównych twierdz, gdzie są one potrzebne.

 8
Author: Pavel Minaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 17:39:34

Widziałem trygrafy używane we wczesnych latach 90-tych, aby pomóc konwertować programy PL/1 z mainframe do uruchamiania/kompilowania/debugowania na komputerze PC.

Zajmowali się edytowaniem PL/i na PC za pomocą kompilatora PL / I do C i chcieli, aby Kod działał po przeniesieniu z powrotem do mainframe, który nie obsługuje nawiasów klamrowych. Zasugerowałem, że mogą używać makr takich jak

#def BEGIN {    
#def END }  

Lub jako przyjazna alternatywa PL / I

#def BEGIN ??<
#def END ??>
I jeśli naprawdę chcieli się wykąpać, mogli try
#ifdef MAINFRAME
    #def BEGIN ??<
    #def END ??>
#else
    #def BEGIN {    
    #def END }  
#endif

I wtedy program wyglądałby tak, jakby był napisany w Pascalu. Po prostu dziwnie na mnie patrzyli i nie chcieli ze mną rozmawiać przez resztę dnia. Chyba ich nie winię. :)

To, co zabiło wysiłek, to nie tri-grafy, to były różnice systemu IO między platformami. Otwieranie plików na PC było o tyle inne niż na mainframe, że wprowadziłoby zbyt wiele kludge ' ów, aby utrzymać ten sam kod na obu.
 4
Author: Kelly S. French,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 15:01:54

Niektóre europejskie klawiatury Nie (Nie?) mają wszystkie znaki interpunkcyjne, które miały Amerykańskie klawiatury, ponieważ potrzebowały klawiszy do ich nietypowych znaków alfabetycznych. Tak więc na przykład (wymyślając to), szwedzka klawiatura miałaby pierścień A, w którym znajdowała się klamra.

Aby dostosować się do tych użytkowników, trygrafy są sposobem wprowadzania interpunkcji przy użyciu tylko najczęstszych znaków ASCII.

 3
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-11 13:45:34

Głównie dlatego, że standard C wprowadził je w 1989 roku, kiedy pojawiły się problemy z obecnością znaków, które trigraf map na niektórych maszynach. Do czasu opublikowania standardu C++ w 1998 r., zapotrzebowanie na trygrafy nie było wielkie. Są brodawką na C; są tak samo brodawką na C++. Były one potrzebne-zwłaszcza poza anglojęzycznym światem - dlatego zostały dodane do C.

 2
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-05 17:24:53

Są tam głównie ze względów historycznych. Obecnie większość nowoczesnych klawiatur dla większości języków umożliwia dostęp do wszystkich tych znaków, ale kiedyś był to problem z niektórymi europejskimi klawiaturami. Dlatego wynaleziono trygrafy.

Jeśli nie wiesz do czego służą, nie powinieneś ich używać.

Nadal dobrze jest mieć ich świadomość, ponieważ możesz przypadkowo i nieumyślnie użyć jednego z nich w swoim kodzie.

 2
Author: sbi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-19 08:16:12