サーチ…


備考

すべてのプリプロセッサがトリグラフシーケンス処理をサポートするわけではありません。いくつかのコンパイラは、それらを処理するための特別なオプションやスイッチを提供しています。他は、別のプログラムを使用して三角形を変換します。

GCCコンパイラは明示的に要求しないかぎり、それらを認識しません(有効にするには-trigraphsを使用し、 -Wall一部である-Wtrigraphs使用して、トリグラフについての警告を取得します)。

現在使用されているほとんどのプラットフォームはC言語で使用されている一文字の全範囲をサポートしているため、三角形よりも有向グラフが優先されますが、複数文字の文字列の使用は一般的には推奨されません。

また、誤った三方グラフの使用( puts("What happened??!!");など)にも注意してください。

トリグラフ

記号[ ] { } ^ \ | ~ #頻繁例えば(Cプログラムで使用されるが、1980年代後半に、コードセットは(ISO 646個の変異体は、北欧諸国では、例えば、)を使用していたこれらのASCII文字位置は、国語バリアント文字のために使用された場所をされています£#英国では、 Æ Å æ å ø Øのため{ } { } | \デンマークで、何もありませんでした~ EBCDICで)。これは、これらのセットを使用するマシンにCコードを記述するのは難しいことを意味していました。

この問題を解決するために、C標準では3文字の組み合わせを使用して3文字という1文字を作成することを提案しました。トリグラフは3文字のシーケンスで、最初の2文字は疑問符です。

次は、 #{}代わりにトリグラフシーケンスを使用する簡単な例です:

??=include <stdio.h>

int main()
??<
    printf("Hello World!\n");
??>

これは、Cプリプロセッサによって、コードが書かれているかのように、三文字を一文字に置き換えることによって変更されます:

#include <stdio.h>

int main()
{
    printf("Hello World!\n");
}
トリグラフ等価
?? =
?? / \
?? ' ^
??( [
??) ]
?? |
?? < {
??> }
?? -

例えば、 ??/はバックスラッシュであり、コメント中の継続行の意味に影響を及ぼし、文字列や文字リテラルの内部で認識されなければならないことに注意してください(例えば、 '??/??/'は単一です文字、バックスラッシュ)。

有向グラフ

C99

1994年には、5つのトリグラフのより読み易い代替案が提供された。これらは2文字のみを使用し、有向グラフとして知られています。三角形とは異なり、二面グラフはトークンです。他のトークン(例えば、文字列リテラルまたは文字定数)で有向グラフが発生した場合、それは有向グラフとして扱われることはありませんが、そのままになります。

次に、有向グラフシーケンスの処理前後の差異を示します。

#include <stdio.h>

int main()
<%
    printf("Hello %> World!\n"); /* Note that the string contains a digraph */
%>

どちらも同じように扱われます:

#include <stdio.h>

int main()
{
    printf("Hello %> World!\n"); /* Note the unchanged digraph within the string. */
}
有向グラフ等価
<: [
:> ]
<% {
%> }
%:


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow