2016-07-31 6 views
-3

C++コンパイラ(および他のプログラミング言語用のコンパイラ)にはなぜあいまいなエラーメッセージがありますか?それはおそらく歴史に基づいていますか?怠惰?それとも、誰にとっても明確なエラーメッセージを出すのは難しいですか?なぜC++コンパイラにはわかりにくいエラーメッセージがあるのですか

テンプレートエラーから生成されたエラーメッセージは、むしろ煩わしい/威嚇することがあります。さらに、エラーメッセージは、“静的メンバ関数がcv修飾子を持つことができないなど、非直感的な略語を使用することができます。 ”私は、“ cv ”が一定/揮発性を表していると信じています。

+2

イラスト - 現代のコンパイラは、一般的にかなり良く明示的なエラーメッセージを生成します。彼らはあなたが書いている言語を知っていると仮定しますが、それだけです。 'cv-qualifier'に関しては、これはC++標準(例えば、2011年標準の§3.9.3CV修飾子[basic.type.qualifier])で使用される言語の専門用語です。はい、 'constまたはvolatile修飾子'を意味します。 –

+0

それは問題ではありません。テンプレートエラーはテキストの壁を生成しますが、唯一重要なことは最初のエラーの行番号です。私は決して言わないことに注意を払っていません。 –

+2

C++にはエラーメッセージがありません。コンパイラの実装にはエラーメッセージがあります。したがって、あなたの質問は、それぞれの場合のインプリメンテータに対処する必要があります。 – EJP

答えて

10

まず、エラーメッセージを表示するのはC++ではありません。あなたのコンパイラです。これは学術的に聞こえるかもしれませんが、それは重要な違いです。コンパイラ診断はすべてメインストリームの実装ではかなり複雑なので、実際はあなたの質問に影響しません。

これは怠惰ではなく、歴史的なものではありません。それは、これらの要因の組み合わせです:

  • それは本当の専門家は、彼らが使用できる情報を取得しないことを意味するときには、いくつかの初心者のためには良いdumbingダウンません

    正確にしたいです。あなたの例では、 "cv-qualifier"は正確で正確で、何が起こっているかを伝えます。あなたはそれを説明する他の方法を見つけることができますが、それは実際にあなたが使っている言語の面で進んでいるものに対応していないか、間違っているでしょう。

  • 実装の複雑

    さて、公平であるために、テンプレートの診断は恐ろしいすることができます。より最近のGCCバージョン、Clang、そしてSTLFiltのようなツールでこれを改善する努力がなされています。しかし、最終的に、これは正しいことが難しいです。本当にやるのはとても難しいです。あなたがより良い仕事をすることができると思えば、気に入った実装にパッチを提出してください。 :)

  • 言語の複雑

    C++は非常に複雑です。それはその性質です。小さなスクリプト言語や、どんな言葉を使ってもきれいなメッセージを伝えるよりもはるかに強力です。ある人は、その建設がでもという複雑なものであると主張するかもしれません。それは言語の共通の批判です。複雑で正確な診断のためににはが必要であると言えるでしょう。

  • これが第一の要因の変化である

    を読んで心を行うことができないこと。より簡単なエラーメッセージのセットを生成するために、コンパイラは、コードが壊れたときに、代わりに書きたいものを知る必要があります。それは読書を気にせずには不可能です。コンパイラは、推測しようとすると並べ替えることができますが、リスクはそれが間違った推測を得ることです。実際、C++と同じくらい複雑な言語では、そのリスクはかなり高いです。だから私たちはコンパイラが私たちとまっすぐであることを望んでおり、私たちが書いたコードとパターンマッチ診断に脳を鍛えることができます。プロのC++開発者は、通常、特定のエラーメッセージの原因(特定のコードによって引き起こされる)を単なる秒数で認識することができます。たとえそのエラーメッセージが起こったとしても、そのエラーメッセージは完全に役に立たないようなものです。それが私たちの貿易の魔法です!

+0

*エラーメッセージシンプリファイア*は存在します。古い[stlfilt](http://www.bdsoft.com/tools/stlfilt.html)。理想的には、コンパイラはそれを行うべきであり、ソースコードに関するより詳細な知識を使用して、名前を付けることができます。関数型プログラミングではwhere節が好きです。私は、管理と開発のための限られたリソースのために行われていない主な理由を推測します。たとえば、g ++はエラーメッセージの関連情報を、最初のエラーで停止するように要求したときに抑制されるフォローアップ行として出力します。これは、簡単に修正できた品質の欠如です。 –

+0

私はあなたのポイントを理解しています。正確であることは間違いありませんが、一般的に非直感的な略語を使用するのは嫌です。定数/揮発性修飾子への拡張cv-qualifierは、ほぼ同じ目的を達成します。 –

+0

@ J-Win: "cv-qualifier"は正確に正しい用語であり(標準からそのまま引き継がれます)、C++開発者にとっては直感的です。彼らはそれが何を意味するか知っている。一度それだけを見る必要がない人。メッセージを毎回完全に書き込むと、メッセージは技術的に正確でなくなり、冗長で冗長になり、最終的には役に立たなくなります。 –

関連する問題