2012-02-21 12 views
9

私は最初にclangを使って構築している(レガシー)コードをいくつか持っています。コードのようなものです:clangでトリグラフを無効にするスイッチはありますか?

​​

クランは、次の警告(-Werrorとの誤差)を与える:

test.c:6:33: error: trigraph converted to '}' character [-Werror,-Wtrigraphs] 
    sprintf(buf, "%s <%s ????>", p1, p2); 
         ^

明らかに??>はトリグラフとして意図されていないので、私は(完全トリグラフを無効にしたいですソースは意図的にどこでもそれらを使用しません)。

私は-no-trigraphsを試してみましたが、それは本当にオプションではありません。

clang: warning: argument unused during compilation: '-no-trigraphs' 

私は-Wno-trigraphsと警告トリグラフをオフにすることができますが、私はトリグラフ変換が実際にすべての場所を取るしたくありません。

注:を使用すると意図しない副作用としてトリグラフが有効になりました。

+2

おっと! GCCは、厳密な準拠モードであっても、trigraphsを無視して、 '-trigraphs 'で火をつけない限り、無視してしまいます。 'sed'を壊す時間?または同等のもの。 –

+3

実際、GCCの厳格な準拠モード( '-std = c89'、' -std = c99'など)はトリグラフ変換を有効にします。 – zwol

+1

誰かがWTHが三角形であると不思議に思うなら。 [ここにポニーがあります](http://stackoverflow.com/questions/7825055/what-does-the-c-operator-do)... – Mysticial

答えて

6

のGNU *モード使用してみてください - 「GNU *モードでオフであることにトリグラフのデフォルトを、彼らは-trigraphsオプションで有効にすることができます。」 (他の違いとコマンドラインスイッチについてはhttp://clang.llvm.org/docs/UsersManual.html#c_modesを参照してください)

+0

ああ、それでした!私は '-std = c89'を使っていましたが、' -std = gnu89'を実行すると '-Wno-trigraphs'で無効にすることができる' error:trigraph ignored [-Werror、-Wtrigraphs] 'というメッセージが表示されます。 –

+2

gnu拡張機能も有効にせずにtrigraphsを無効にする方法はありますか? – bames53

4

(トリグラフの警告ではなく)トリグラフを無効にする明白な方法はありませんでした。おそらく、このコードを修正する最も簡単な方法は、それを変更することです:

sprintf(buf, "%s <%s ????"">", p1, p2); 
+0

これは合理的な選択肢のようです。ソースの何百万もの行のうち、 '??>'は4回しか発生しません。 –

+0

'" ... ??? ??? \?> "'も動作するはずです。トリグラフ自体の2つの疑問符の間にバックスラッシュを置きます。 – zwol

+0

トリグラフはどこにでも置くことができるので、三角形を安全なシーケンスに変換するには、 'sed 's/?? \([ - <>()\/=#'] \)/?\\?\ 1/g" 。一方、文字列の外側では、三角形はその標準形に最も良く変換されるでしょうか?何が最善かを決めるにはちょっと面倒です。 (ちょうど一度だけ、私の 'sed'スクリプトは、パターンの中に一重引用符があるので、パターンを二重引用符で囲みます。) –

関連する問題