Чтение сообщений об ошибках
Ошибки — нормальная часть программирования. Даже опытные программисты делают их каждый день. Важно быстро находить и исправлять их, и в этом помогают сообщения об ошибках.
Перед запуском программы компилятор просматривает её целиком. Если он находит ошибку, то вообще не запускает программу, даже строки до ошибки, и показывает в выводе красное сообщение об ошибке. Например, в этой программе в строке 4 пропущена точка с запятой:
#include <iostream>
int main() {
std::cout << "Привет!" << std::endl
std::cout << "Как дела?" << std::endl;
}Clang, компилятор, который компилирует программы на этом сайте, выводит:
main.cpp:4:46: error: expected ';' after expression
4 | std::cout << "Привет!" << std::endl
| ^
| ;
1 error generated.Самое важное — первая строка сообщения. Читайте её слева направо:
main.cpp— имя файла с программой, того, что открыт в редакторе.4— номер строки с ошибкой. Номера строк видны слева в редакторе.46— номер столбца: каким по счёту символом в строке находится ошибка. Clang считает байты, а каждая русская буква занимает два, поэтому число получается больше, чем если считать буквы.error:говорит, что это ошибка. После него идёт описание:expected ';' after expressionзначит, что компилятор ожидал;после выражения.
Ниже Clang показывает строку с ошибкой и отмечает место значком ^. Часто он даже пишет, чего там не хватает, здесь — ;. Последняя строка, 1 error generated., просто сообщает, сколько ошибок нашёл Clang.
Если в конце текста пропущена кавычка, сообщение выглядит немного иначе:
#include <iostream>
int main() {
std::cout << "Привет! << std::endl;
}main.cpp:4:18: warning: missing terminating '"' character [-Winvalid-pp-token]
4 | std::cout << "Привет! << std::endl;
| ^
main.cpp:4:18: error: expected expression
1 warning and 1 error generated.Строка с пометкой warning: — это предупреждение: компилятор указывает на то, что выглядит подозрительно. Здесь оно даже полезнее самой ошибки. missing terminating '"' character значит, что не хватает закрывающей кавычки, а ^ указывает на кавычку, у которой нет пары. Без неё компилятор не может понять, где кончается текст, поэтому после << он не находит ничего осмысленного: expected expression значит, что он ожидал выражение — то, что нужно вывести.
Иногда одна ошибка вызывает несколько сообщений. Например, если пропущена строка #include <iostream>, вы получите ошибку use of undeclared identifier 'std' (имя, которого компилятор не знает) для каждого std:: в программе. Поэтому всегда сначала исправляйте первую ошибку и запускайте программу снова. Остальные сообщения часто исчезают, потому что их вызвала только первая ошибка. И наоборот: после исправления может появиться новая ошибка, которую компилятор раньше не нашёл.
Другие частые ошибки и их сообщения:
- Перед
coutнетstd:::use of undeclared identifier 'cout'; did you mean 'std::cout'?Clang даже подсказывает, что вы, скорее всего, имели в виду. - Заглавная буква вместо строчной:
no member named 'Cout' in namespace 'std'; did you mean 'cout'? - В конце программы нет
}:expected '}'
Строки с note: — это просто дополнительные пометки. Они часто указывают на файлы стандартной библиотеки, так что обращать на них внимание не нужно.
Задание
- 1
В программе в редакторе две ошибки: пропущены точка с запятой и кавычка. Запустите её и прочитайте первое сообщение об ошибке: в какой строке и в каком столбце ошибка и что не так? Исправьте ошибку и запустите программу снова. Повторяйте, пока программа не выведет:
Турнир по крестикам-ноликам Когда: в субботу в 10:00 Где: кабинет 2Б