8

Turbo C++ を使用してコンパイルされた trigraph を含むプログラムのスクリーン ショット

GCC コンパイラでも、trigraph 属性を明示的に指定しないと、trigraph はコンパイルされません。

#include<stdio.h>

int main()
 {
 int a=4;
 if((a==4) ??! (a==5))
   printf("\nHello world!");
 return 0;
 }

try.c として保存されたこのプログラムは、指定gcc -Wall -trigraphs try.cした場合にのみ GCC コンパイラでコンパイルされ、それでも警告が表示されます。エラーや警告なしでトライグラフを処理するコンパイラをいくつか登録できますか?

4

4 に答える 4

10

三重音字は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以前ではトリグラフとして扱われていたシーケンスについて警告したり、トリグラフをサポートするオプションを提供したりするのが妥当です。繰り返しますが、そのような警告を無効にするオプションは良いことです。

于 2012-12-02T08:33:45.153 に答える
5

GCC はトライグラフにアレルギーがあります。それらを明示的に有効にする必要があります。

gcc -trigraphs ...

GCC 4.7.1 マニュアルには次のように書かれています。

-trigraphs

ISO C トリグラフをサポートします。-ansiオプション (および-std厳密な ISO C 準拠のオプション) は、 を意味し-trigraphsます。

また、次のようにも述べています。

-Wtrigraphs

プログラムの意味を変える可能性のあるトリグラフに遭遇した場合に警告します (コメント内のトリグラフは警告されません)。この警告は によって有効になってい-Wallます。

于 2012-11-29T05:43:45.830 に答える
2

デフォルトではオフになっている場合があります。

「一部のコンパイラは、トライグラフの認識をオフにするオプション、またはデフォルトでトリグラフを無効にするオプションをサポートしており、それらをオンにするオプションが必要です」

GCC は後者の 1 つかもしれません。デフォルトでは warningで無視する必要がありますが、この場合、無視するとコンパイルエラーが発生する可能性があります

于 2012-11-29T05:39:39.903 に答える
1

三重音字は、コンパイルの非常に早い段階で変換され、文字列リテラルに置き換えることもできます。これにより、トリグラフの変換から発生するエラーを検出するのが非常に困難になります(ログを使用したデバッグを検討し、ソースに出力が見つかった場合は最悪です)。

表示される警告は、バグの原因を追跡するために考えられる原因をすばやく特定するのに役立ちます。基本的に、何かが思ったとおりになっていない可能性があることを警告しています。

于 2012-11-29T05:59:38.317 に答える