根本的な問題は、状況に関係なく、エラーの回復が難しいことです。
そして、C や C++ の恐ろしい文法を考慮に入れると、エラー メッセージがそれよりも悪くないことに驚くだけです! 残念ながら、C 文法は、文法の本質的な特性について手がかりを持たない人々によって設計されたのではないでしょうか。できるだけ明確に。
一般的なエラーを説明しましょう: セミコロンの忘れです。
struct CType {
int a;
char b;
}
foo
bar() { /**/ }
わかりました、これは間違っています。行方不明のセミコロンはどこに行けばよいでしょうか? 残念ながら、あいまいです。次のfoo
理由により、前または後に移動できます。
- C では、変数を定義した後、ストライドで変数を宣言するのが通常と見なされます。
struct
- C では、関数の戻り値の型を指定しないのが普通と見なされます (その場合、デフォルトは になります
int
) 。
推論すると、次のことがわかります。
- 型に名前を付ける場合
foo
、それは関数宣言に属します
- そうでない場合は、おそらく変数を示しています...もちろん、タイプミスをして、それが書かれることを意図していた場合を除いて、
fool
それはたまたま型です:/
おわかりのように、エラーの回復は非常に困難です。なぜなら、書き手の意図を推測する必要があり、文法が受容的とはほど遠いからです。不可能ではありませんが、ほとんどのエラーは多かれ少なかれ正確に診断でき、回復することさえできます...かなりの労力が必要です。
に取り組んでいる人々は、高速gcc
なコードを生成すること(gcc 4.6 で最新のベンチマークを検索することを意味します) と興味深い機能を追加することに関心があるようです (gcc は、C++0x のすべてではないにしてもほとんどを実装しています)。エラーメッセージが読みやすい。あなたは彼らを責めることができますか?私はできません。
幸いなことに、正確なエラー報告と優れたエラー回復が非常に価値のある目標であると考えている人がいます。その中には、かなり長い間 CLang に取り組んできた人もいます。
私の頭の上からいくつかの素晴らしい機能:
- エラーがどこから発生したかを正確に明らかにするためのソース範囲を含む、簡潔だが完全なエラーメッセージ
- Fix-Itは、意図されたことが明らかな場合に記録します
- その場合、コンパイラは、意味不明な行に行を吐き出す代わりに、修正が既に存在するかのようにファイルの残りを解析します。
- (最近) ノートにインクルード スタックを含めるのを避けて、クラフトを切り取ります。
- (最近) 開発者が実際に書いたテンプレート パラメーターの型のみを公開しようとし、typedef を保持します (したがって、どちらがすべての違いを生むかについて話
std::vector<Name>
しstd::vector<std::basic_string<char, std::allocator<char>>, std::allocator<std::basic_string<char, std::allocator<char>> >
ます)
template
(最近)別のテンプレートメソッド内からのテンプレートメソッドへの呼び出しで欠落している場合に欠落した場合に正しく回復する
しかし、それぞれに数時間から数日かかる作業が必要です。
彼らは確かにタダではありませんでした。
さて、概念は (通常) 私たちの生活を楽にしてくれるはずです。しかし、それらはほとんどテストされていなかったため、ドラフトから削除することが望ましいと見なされました。これは嬉しいと言わざるを得ません。C++ の相対的な慣性を考えると、完全に改訂されていない機能を含めないほうがよいでしょう。また、コンセプト マップにはあまり感心しませんでした。Bjarne も Herb も、次の標準に向けて概念をゼロから再考すると言ったように、興奮していないようです。