Почему компилятор C ++ выдает ошибки после строк, а не на них?

Этот вопрос пришел мне в голову сегодня на работе, когда у меня был еще один домашний роман с моим компилятором. Несмотря на мой буйный мизинец (из-за того, что я всегда использую точку с запятой на работе), мне удалось пропустить один перед оператором 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 ++, может конкретно объяснить, что делает компилятор, что требует сообщения об ошибках таким способом «до».

9
задан Chad La Guardia 16 August 2011 в 07:12
поделиться