2017-09-09 34 views
-3

私は最近、C++用の新しいIDEを探し始めました。私はDev C++を使っていましたが、他のIDEと比較して少しベアボーンです。なぜprintfはDev C++では動作しますが、CLionでは動作しませんか?

私は教授と話し合おうとした問題にぶつかりました。そして、彼はそれがIDEライブラリそのものではなく、標準的なライブラリの実装に起因する可能性が高いと言いました。それ?私はポイントに達するでしょう:

私はprintf( "%'14 .2f"、変数)と言うとき、それは私が期待していたように印刷されます。しかし、CLionでは、%記号をマークし、 "Unknown、incomplete、optional format specifier"と表示し、変数の代わりに'14 .2f 'を出力します。私はこれがアポストロフィのためであることを知っていますが、それを修正する方法はわかりません。

誰にもアイデアはありますか?私の教授は、GCCのlibstd ++はうまくいくはずだと言ったが、私はその情報をどうするべきか分からない...

ありがとう!

編集:私はWindowsのところです。

+0

フォーマット文字列内には何がありますか?それはC + +、std :: coutを使用します! –

+0

[documentation](http://en.cppreference.com/w/cpp/io/c/fprintf)で説明されているように、_変換指定が無効な場合、その動作は未定義です。したがって、このような 'printf'ステートメントによって生成された出力は、あなたの期待にかかわらず「正しい」ものです。 –

+2

Um ...アポストロフィを削除しますか? printf形式指定子では無効です。それはなぜ最初にそこにあるのですか? –

答えて

1

printf書式文字列のフラグ文字としてアポストロフィの使用は、POSIXによって定義された拡張子である。

小数点変換(%i%dの結果の整数部、 %u%f%F%g、または%G)は、千単位のグループ化 文字でフォーマットされていなければなりません。他のコンバージョンの場合、動作は未定義です。非金銭的なグループ化文字が使用されます( )。

あなたの教授は正しいです:この拡張のサポートは、IDEまたはコンパイラではなく、標準ライブラリの実装によって決まります。

しかし:

私の教授はGCCのlibstd ++は正常に動作する必要がありますが、私はその情報をどうするのか分からないと述べました。

libstdC++はC++ライブラリです。これは、printf関数の実装を提供しません。これはCライブラリの一部です。 (C++ライブラリにはCライブラリのほとんどが含まれています)

IDEで使用しているC++実装(コンパイラとライブラリ)を調べる必要があります。 Dev C++で使用されているのと同じC++実装を使用するために、CLionを同軸にすることができます。

+0

"この拡張機能のサポートは、IDEまたはコンパイラではなく、標準ライブラリの実装によって決まります。 - 何だって?この機能のサポートは、GCCコンパイラがフォーマット文字列を参照するなど、コンパイラによって確実に判断できます。 –

+0

@NeilButterworth:gccコンパイラはフォーマット文字列を参照しますが、それだけで警告を出すことができます。警告を出したり出さなかったりすると、渡された引数を使って 'printf'関数の呼び出しを生成します。 gccもclangも 'printf'の実装を提供しません。たとえば、私のシステムでは 'printf'実装はgccとは別のプロジェクトであるglibcによって提供されています。 –

+0

@KeithThompsonそういうことをやってどこから始めなければならないのか分かりませんか?私はこれのようなIDEを変更する経験はあまりありません。 – Andersma

関連する問題