C++1z トライグラフを削除

C言語から引き継がれた「トライグラフ (trigraph)」という機能は、ASCIIより小さなISO/IEC 646という文字コードでもプログラムが書けるように用意された機能で、いくつかの文字の代替表現を使用できるようにするものです。

トライグラフ表現 置き換え後の文字
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

以下のトライグラフを使用したコードは、

??=define arraycheck(a,b) a??(b??) ??!??! b??(a??)

以下のように置き換えられます:

#define arraycheck(a,b) a[b] || b[a]

文字コードの問題がなくなった現代では、トライグラフは不要になりました。ユーザーにとってわかりにくいこともあり、多くのコンパイラがトライグラフをデフォルトで無効にしたり警告を出力したりといった対応をしていました。

C++1zの策定作業にともない、トライグラフの利用状況が大規模に調査されました。この機能が使用されていることはほとんどないということがわかり、C++1zからはトライグラフが削除されることが決定しました。

今後、トライグラフを使用したC++コードはコンパイルが通らなくなりますので、注意してください。C言語の方はC11時点でまだ残っています。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。