三重音字は1989年のANSIC規格によって導入され、それ以降のすべてのC規格で保持されています。これらは、1998年に公開された最初のISO C ++標準、およびC++14までのそれ以降のすべてのC++標準にも含まれています。(三重音字はC ++ 17で削除されました。詳細を追跡してくれたJonathanLefflerとdypに感謝します。)
C ++ 17標準のドラフトを引用します:
元の機能への影響:トリグラフを使用する有効なC ++ 2014コードは、有効でないか、この国際規格で異なるセマンティクスを持っている可能性があります。実装は、物理ソースファイル文字から基本ソース文字セットへの実装定義のマッピングの一部として、生の文字列リテラルの外部に表示される場合、C++2014で指定されているように三重音字を変換することを選択できます。
これらはどちらの言語でもオプション機能ではありません(C ++ 17より前)。準拠するすべてのコンパイラは、それらをサポートし、それぞれの言語標準で指定されているように解釈する必要があります。
たとえば、このプログラムの場合:
#include <stdio.h>
int main(void) {
if ('|' == '??!') {
puts("ok");
}
else {
puts("oops");
}
return 0;
}
を出力oops
すると、コンパイラは不適合になります。
しかし、多くの、おそらくほとんどのCコンパイラは、デフォルトでは完全には準拠していません。コンパイラが何らかの方法で標準に準拠するように作成できる限り、標準に関する限り、それで十分です。(gccはこれを行うために必要-pedantic
です-std=...
。)
しかし、コンパイラが完全に準拠している場合でも、コンパイラが好きなことについて警告することを禁止する規格はありません。準拠するCコンパイラは、構文規則または制約の違反を診断する必要がありますが、必要な数の追加の警告を発行できます。また、必要な診断と他の警告を区別する必要はありません。
三重音字はめったに使用されません。開発システムの大部分は#
、三重音字が代用するすべての文字を直接サポートします[
:、、、、、、、、、、、。\
]
^
{
|
}
~
実際、トリグラフは正しく使用されるよりも誤って使用されることが多い可能性があります。
fprintf(stderr, "What just happened here??!\n");
プログラムの意味を変更する可能性のあるトリグラフに関する警告(言語にトリグラフがない場合の意味と比較して)は、ISO標準とIMHOの両方で完全に合理的に許可されています。ほとんどのコンパイラには、おそらくそのような警告をオフにするオプションがあります。
逆に、トリグラフを実装しないC ++ 17コンパイラの場合、C ++ 14以前ではトリグラフとして扱われていたシーケンスについて警告したり、トリグラフをサポートするオプションを提供したりするのが妥当です。繰り返しますが、そのような警告を無効にするオプションは良いことです。