ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
三字一音、三重音字。C/C++の規格にある、3文字で1文字を表わすための規格。
CのソースをISO/IEC 646:1983の不変文字セットの範囲で記述するための悪名高い記法。??に続けて特定の文字を記述することで、ISO/IEC 646にない文字を表現する。
ISO/IEC 646しか使えないレガシーな環境でもCのプログラムが書けるように配慮されて導入された仕様である。
この仕様は、C++にもそのまま採用されたが、こちらはC++17で仕様から削除された。
ISO/IEC 646は、ASCIIの拡張として、ASCIIにある12文字を任意の文字に変えても良い、という規格である。
その変えても良いという文字に、# [ \ ] ^ ` { | } ~ というC/C++でよく使う文字が含まれており、そのままではCらしいコードが書けないと危惧されたことから、この仕様の導入が決定された。
トライグラフ表現 | 置き換え後の文字 |
---|---|
??= | # |
??/ | \ |
??' | ^ |
??( | [ |
??) | ] |
??! | | |
??< | { |
??> | } |
??- | ~ |
21世紀ともなった現在、現実問題としてISO/IEC 646しか使えないレガシーな環境でCソースをコンパイルする機会などほぼ皆無(?)である。欧米圏ですらISO/IEC 8859-1の時代を通り過ぎ、既にUnicodeが主流となりUTF-8が一般化しており、ISO/IEC 646など完全に過去の存在となった。
このため余計な解釈で意図しない文字が現われて混乱のもとになることのほうが多いが、ANSI準拠のためにはトライグラフを解釈できる必要がある。しかしトラブルの方が多いため、C/C++コンパイラーによっては標準では無効で必要に応じてオプションで有効にする対応としていることも多い。
GCCではデフォルト無効。-trigraphsオプションで有効になる。
clang/LLVMでもデフォルト無効で、-Wtrigraphsで有効になる。
Microsoft C/C++でも新しいものはデフォルト無効となり、/Zc:trigraphs で有効となる。
トライグラフには需要が存在せず、逆にコードを書く妨げにしかなっていない。
このため既に公害でしかなくなったこの仕様は、C++ではC++17にて遂に仕様から削除された。Cではこれを著している時点でまだ仕様から削除されていない。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます