Trigraphs
Zdroj znakové sady zdrojových programů jazyka C je obsažen v 7bitové znakové sadě ASCII, ale je nadmnožinou invariantní znakové sady standardu ISO 646-1983. Sekvence trigrafů umožňuje, aby programy jazyka C byly zapsány pouze pomocí invariantní znakové sady standardu ISO (International Standards Organization). Trigrafy jsou sekvence tří znaků (uvedené dvěma po sobě jdoucími otazníky), které kompilátor nahradí jejich odpovídajícími znaky interpunkce. Trigrafy lze použít ve zdrojových souborech jazyka C, které používají znakovou sadu, která neobsahuje vhodné grafické reprezentace pro některá interpunkční znaménka.
C++17 odebere trigrafy z jazyka. Implementace mohou nadále podporovat trigrafy v rámci mapování definovaného implementací z fyzického zdrojového souboru do základní zdrojové znakové sady, i když standard podporuje implementace, které to neudělá. Prostřednictvím C++14 jsou trigrafy podporované jako v jazyce C.
Visual C++ nadále podporuje nahrazení trigrafu, ale ve výchozím nastavení je zakázané. Informace o tom, jak povolit nahrazení trigrafu, najdete v tématu /Zc:trigraphs
(Nahrazení trigrafů).a0>
Následující tabulka obsahuje devět sekvencí trigrafů. Všechny výskyty znaků interpunkce v prvním sloupci ve zdrojovém souboru jsou nahrazeny odpovídajícím znakem ve druhém sloupci.
Sekvence trigraf
Trigraf | Znak interpunkce |
---|---|
??= |
# |
??( |
[ |
??/ |
\ |
??) |
] |
??' |
^ |
??< |
{ |
??! |
| |
??> |
} |
??- |
~ |
Trigraf je vždy považován za jediný zdrojový znak. Překlad trigrafů probíhá v první fázi překladu před rozpoznáním řídicích znaků v řetězcových literálech a konstantách znaků. V tabulce výše je rozpoznáno pouze devět trigrafů. Všechny ostatní sekvence znaků zůstanou nepřevedeny.
Řídicí sekvence \?
znaků zabraňuje chybné interpretaci sekvence znaků podobné trigrafu. (Informace o řídicích sekvencích najdete v tématu Řídicí sekvence.) Pokud se například pokusíte vytisknout řetězec What??!
pomocí tohoto printf
příkazu.
printf( "What??!\n" );
tištěný řetězec je What|
způsoben ??!
posloupností trigrafu, která je nahrazena znakem |
. Chcete-li tento řetězec vypsat správně, napište příkaz takto:
printf( "What?\?!\n" );
V tomto příkazu printf
řídicí znak zpětného lomítka před druhým otazníkem zabraňuje špatnému vyhodnocení ??!
jako trigrafu.