C/C++のtrigraph


C/C++は古い世代のプロレタリア革命家の世話をするために、彼らの条件は極めて苦しく、キーボードには多くのキーが欠けています.
次の9文字を入力できません:
    #\^ [ ] { } | ~
そこでtrigraphを発売し、
簡単に言えば、上の各文字を他の3文字に置き換えることです.
置換のルールは次のとおりです.
#: ??=
\: ??/
^: ??'
[: ??(
]: ??)
{: ??<
}: ??>
|: ??!
~: ??-

例えば、次のC++プログラムです.
#include <iostream>

int main() {
  std::cout << "[]" << std::endl;
}

次のように書き換えることができます.
??=include <iostream>

int main() ??<
  std::cout << "??(??)" << std::endl;
??>

trigraphを対応する文字に置き換える前に、
したがってtrigraphはソースコードの任意の場所で使用できます.
文字列内、関数体の先頭、前処理命令などが含まれます.
もし私が文字列定数を使っていたら、「???=」が含まれていたらどうしますか?
例えば、2つの疑問符を印刷して1つの等号を受け取るには、どうすればいいですか?
簡単に、それを分解して書き、「???=」を印刷するために、私たちはそれを「???」に分解します.「=」でいいです.
C/C++は文字列の文字面値を扱う際に隣接する複数の文字列の文字面値を一つにまとめるので、
このマージ操作はtrigraph置換後に発生し、
次のプログラムでは、2つの疑問符と1つの等号を正しく印刷できます.
#include <iostream>

int main() {
  std::cout << "??" "=" << std::endl;
}

実測中、
VC 8はtrigraphを対応文字に置き換えるヒントを与えず、
GCC 4.0.3では、コンパイルパラメータ-trigraphsを加えて変換する必要があります.
GCCのやり方は基準に合わないが、より安全だ.
より詳細な場合は、基準2.3を参照してください.