Короткий ответ на более общий вопрос «Почему сообщения об ошибках C / C ++ отстают» - «Иногда C ++ действительно трудно анализировать» (фактически он не имеет контекстно-свободной грамматики).Однако на самом деле это не является веской причиной - все же можно создавать инструменты, которые записывают лучшую диагностическую информацию, чем большинство компиляторов C ++.
Более практичный ответ: «Авторы компиляторов унаследовали унаследованные кодовые базы, которые не оценивали ошибкусообщения », в сочетании с легкой дозой« авторы компилятора ленивы », увенчанные« Диагностическая отчетность не является захватывающей проблемой ».Большинство авторов компиляторов добавили бы новую языковую функцию или 3% -ное улучшение производительности codegen, вместо того, чтобы делать существенный рефакторинг на базе кода, чтобы позволить достойные сообщения об ошибках.Конкретный вопрос о том, «почему ошибки не локализованы должным образом в строке, которая их« вызвала », является примером этого.На самом деле нет технической причины, по которой компиляторы обычно не могут решить, что отсутствует ;
, а затем сообщают вам об исходном диапазоне последнего оператора, не содержащего ;
, даже при наличии общей неизменности пробелов в C ++.Просто хранение этой информации (в значительной степени) исторически игнорировалось.
Тем не менее, новые компиляторы, которым не мешает десятилетия старого кода, работают намного лучше.Взгляните на Clang compiler , который гордится разумными сообщениями об ошибках.Страница по диагностике показывает, насколько они лучше, чем GCC.Пример для этого случая:
$ gcc-4.2 t.c
t.c: In function 'foo':
t.c:5: error: expected ';' before '}' token
$ clang t.c
t.c:4:8: error: expected ';' after expression
bar()
^
;
Или, что более впечатляюще:
$ cat t.cc
template<class T>
class a {}
class temp {};
a<temp> b;
struct b {
}
$ gcc-4.2 t.cc
t.cc:3: error: multiple types in one declaration
t.cc:4: error: non-template type 'a' used as a template
t.cc:4: error: invalid type in declaration before ';' token
t.cc:6: error: expected unqualified-id at end of input
$ clang t.cc
t.cc:2:11: error: expected ';' after class
class a {}
^
;
t.cc:6:2: error: expected ';' after struct
}
^
;
Посмотрите, это даже говорит нам, что печатать, где решить проблему!