Этот вопрос пришел мне в голову сегодня на работе, когда у меня был еще один домашний роман с моим компилятором. Несмотря на мой буйный мизинец (из-за того, что я всегда использую точку с запятой на работе), мне удалось пропустить один перед оператором if
. Очевидно, это привело к ошибке компиляции:
ошибка C2143: синтаксическая ошибка: отсутствует ';' перед 'if'
Так что я подумал: «Ну и дела, почему вы не можете сказать мне строку, в которой отсутствует точка с запятой, а не строка после проблемы». и я приступил к экспериментам с другими подобными синтаксическими ошибками:
ошибка C2065: 'myUndeclared': необъявленный идентификатор
ошибка C2143: синтаксическая ошибка: отсутствует ')' перед 'if'
и т. д. ...
Теперь все эти ошибки аналогичным образом приведут меня к строке после проблемы и будут жаловаться на что-то перед оператором if
.
Рассмотрим следующее:
SomeFunction(x) //Notice, there is no ';' here
if(bSomeCondition)
{
...
}
I получить две ошибки компиляции:
(строка 265) ошибка C2065: 'x': необъявленный идентификатор
(строка 266) ошибка C2143: синтаксическая ошибка: отсутствует ';' перед 'if'
Однако первая ошибка правильно сообщает мне номер строки, несмотря на отсутствие точки с запятой. Это говорит мне о том, что компилятор не сбивается с пути при синтаксическом анализе и может решить проблему с точкой с запятой. Итак, почему компилятор настаивает на таком сообщении о грамматических ошибках? Другие ошибки (не грамматические) сообщаются в строках, в которых они обнаружены. Связано ли это с тем, что компилятор выполняет несколько проходов? В принципе, я надеюсь, что кто-то, знакомый с компилятором C ++, может конкретно объяснить, что делает компилятор, что требует сообщения об ошибках таким способом «до».