De acordo com o C ++ '03 Standard 2.3 / 1:
Antes de qualquer outro processamento, cada ocorrência de uma das seguintes seqüências de três caracteres ("sequências trigrafônicas") é substituída pelo caractere único indicado na Tabela 1.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
Na vida real, isso significa que o código printf( "What??!\n" );
resultará na impressão, What|
pois ??!
é uma sequência de trigramas que é substituída pelo |
caractere.
Minha pergunta é qual o objetivo de usar trigramas? Existe alguma vantagem prática de usar trigramas?
UPD : Nas respostas foi mencionado que alguns teclados europeus não têm todos os caracteres de pontuação, então os programadores não americanos precisam usar trigramas no dia a dia?
UPD2 : O Visual Studio 2010 tem o suporte a trigrafs desativado por padrão.
Respostas:
Esta pergunta (sobre os dígrafos intimamente relacionados) tem a resposta.
Tudo se resume ao fato de que o conjunto de caracteres ISO 646 não possui todos os caracteres da sintaxe C, portanto, existem alguns sistemas com teclados e displays que não conseguem lidar com os caracteres (embora eu imagine que sejam muito raros). hoje em dia).
Em geral, você não precisa usá-los, mas precisa conhecê-los exatamente para o problema que encontrou. Trígrafos são o motivo pelo qual o
?
caractere ' ' tem uma sequência de escape:Portanto, algumas maneiras de evitar seu problema de exemplo são:
Mas você precisa se lembrar de quando digitar os dois '?' caracteres nos quais você pode estar iniciando um trígrafo (e certamente nunca é algo em que estou pensando).
Na prática, trigramas e dígrafos são algo com o qual não me preocupo no dia a dia. Mas você deve estar ciente deles, pois a cada dois anos você encontra um bug relacionado a eles (e passa o resto do dia amaldiçoando sua existência). Seria bom se os compiladores pudessem ser configurados para avisar (ou erro) quando se deparar com um trigrafo ou dígrafo, para que eu pudesse saber que tenho algo com o qual devo lidar conscientemente.
E, para completar, os dígrafos são muito menos perigosos, pois são processados como tokens; portanto, um dígrafo dentro de uma string literal não será interpretado como um dígrafo.
Para uma boa educação sobre diversão com pontuação em programas C / C ++ (incluindo um bug de trigrafo que definitivamente me faria arrancar o cabelo), dê uma olhada no artigo GOTW # 86 de Herb Sutter .
Termo aditivo:
Parece que o GCC não processará (e avisará sobre) trigrafs por padrão. Alguns outros compiladores têm opções para desativar o suporte a trigraph (da IBM, por exemplo). A Microsoft começou a oferecer suporte a um aviso (C4837) no VS2008 que deve ser ativado explicitamente (usando -Wall ou algo assim).
fonte
Crianças hoje! :-)
Sim, equipamento externo, como um terminal IBM 3270. O 3270, se bem me lembro, não tem aparelho! Se você quisesse escrever C em um mini / mainframe IBM, teria que usar os trigraphs miseráveis para cada limite de bloco. Felizmente, só precisei escrever software em C para emular algumas instalações de minicomputadores da IBM, e não escrever software C no System / 36.
Olhe ao lado da tecla "P":
Hummm. Difícil de dizer. Há um botão extra ao lado de "retorno de carro" e eu posso usá-lo ao contrário: talvez fosse o par "[" / "]" que estava faltando. De qualquer forma, este teclado causaria pesar se você tivesse que escrever C.
Além disso, esses terminais exibem o EBCDIC, o conjunto de caracteres mainframe "nativo" da IBM, não o ASCII (obrigado, Pavel Minaev, pelo lembrete).
Por outro lado, como o guia GNU C diz: "Você não precisa desse dano cerebral". O compilador gcc deixa esse "recurso" desativado por padrão.
fonte
Da
The C++ Programming Language
edição especial, página 829fonte
`
, que está faltando no italiano e em vários outros layouts de tecladoEles são para uso em sistemas que não possuem alguns dos caracteres no conjunto de caracteres básicos do C ++. Escusado será dizer que esses sistemas são extremamente raros.
fonte
Trígrafos foram propostos para remoção em C ++ 0x. Dito isto, ainda parece haver fortes argumentos a favor deles - veja o documento do comitê C ++ N2910, que discute isso. Aparentemente, o EBCDIC é uma das principais fortalezas onde são necessárias.
fonte
Eu vi trigrafs usados no início dos anos 90 para ajudar a converter programas PL / 1 de um mainframe para serem executados / compilados / depurados em um PC.
Eles estavam envolvidos na edição de PL / I no PC usando um compilador de PL / I para C e queriam que o código funcionasse quando retornados ao mainframe que não suportava chaves. Sugeri que eles pudessem usar macros como
ou como uma alternativa PL / I mais amigável
e se eles realmente quisessem ser extravagantes, poderiam tentar
e então o programa pareceria ter sido escrito em Pascal. Eles apenas me olharam engraçado e não falaram comigo pelo resto do dia. Eu não acho que os culpo. :)
O que matou o esforço e não os tri-gráficos, foram as diferenças do sistema de IO entre as plataformas. A abertura de arquivos no PC era muito diferente do mainframe e teria introduzido muitos kludges para manter o mesmo código em execução em ambos.
fonte
Principalmente porque o padrão C os introduziu em 1989, quando houve problemas com a presença dos caracteres que os trigrafs mapeiam em algumas máquinas. Quando o padrão C ++ foi publicado em 1998, a necessidade de trigramas não era grande. Eles são uma verruga em C; eles são igualmente uma verruga em C ++. Havia uma necessidade deles - especialmente fora do mundo de língua inglesa - e é por isso que foram adicionados ao C.
fonte
Alguns teclados europeus não têm (não?) Todos os caracteres de pontuação que os teclados americanos tinham, porque precisavam das teclas para seus caracteres alfabéticos incomuns. Então, por exemplo (inventando isso), o teclado sueco teria um anel A onde estava a chave.
Para acomodar esses usuários, os trigrafs são uma maneira de inserir pontuação usando apenas os caracteres ASCII mais comuns.
fonte
Eles estão lá principalmente por razões históricas. Atualmente, os teclados mais modernos para a maioria dos idiomas permitem o acesso a todos esses caracteres, mas isso costumava ser um problema com alguns teclados europeus. É por isso que os trigrafs foram inventados.
Se você não sabe para que servem, não deve usá-los.
No entanto, ainda é bom estar ciente deles, pois você pode usar acidental e involuntariamente um no seu código.
fonte