Я начинаю изучать C и с помощью YouTube смог загрузить версию компилятора 6.3.0, хотя в моем учебнике упоминается версия 4.3.3.
Я целенаправленно пытаюсь получить предупреждения (как задачу научиться их интерпретировать) для программы Hello World, не получая ошибок, но не получаю ни одной.
Я убрал return(0)
, а затем убрал вторую кавычку из printf
, но PowerShell просто выполняет программу после компиляции, не выдавая никаких предупреждений.
Я пробовал -W
, -Wall
, -Wextra
, -Wreturn-type
и даже нашел -Wdouble-promotion
, но безуспешно.
Исходный код:
/*
* program that writes 'hello world'
*/
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
Программный код для проверки предупреждений:
#include <stdio.h>
int main()
{
printf("Hello, world!\n);
/* took away the second quote mark
* and the return(0) operation
* to test warnings
*/
}
В результате компиляции и запуска программы
> gcc -Wall -o warning hello_warning.c
PS C:\Users\sofya\OneDrive\Документы\программки> ./warning
Hello, world!
Вместо того, чтобы давать мне некоторые предупреждения, которые предлагает мой учебник, например:
warning: missing terminating " character
Я думаю, вы имеете в виду версию GCC 6.3.0. Сам C не имеет версии 6.3.0.
"Версия C 6.3.0" - такого нет. У вашего компилятора C может быть версия 6.3.0, но это не то же самое, что языковая версия.
Но чтобы узнать, в чем ваша проблема, нам нужно, чтобы вы отредактировали свой вопрос, чтобы показать нам реальную программу, которую вы пытаетесь создать, и то, как вы ее создаете. Пожалуйста, скопируйте и вставьте все это как текст.
Каких предупреждений вы ожидаете? Почему вы ожидаете этих предупреждений? Если ваш код верен, вам не следует ожидать никаких предупреждений.
См. также en.cppreference.com/w/cpp/language/ub
Как отсутствие "
может быть предупреждением? Без него код невозможно правильно разобрать. Компилятор не может решить, что ему следует перейти сюда и сгенерировать исполняемый файл с предупреждением.
Удаление return
из main()
соответствует требованиям и не должно вызывать предупреждений или ошибок. int main()
— единственная непустая функция, от которой не требуется явно возвращать значение.
@WeatherVane, окей, понял. Я только пытался это понять, потому что в учебнике говорится о получении warning: control reaches end of non-void function
, и я запутался и подумал, что делаю что-то не так.
@JesperJuhl, спасибо! Это сработало. Хотя я не понимаю, почему -Wall
и -Wexrtra
не работают сами по себе.
Синтаксическая ошибка, которую вы провоцируете, опуская закрывающий "
, неизменно приводит к ошибке компиляции и, что особенно важно, не создает выходной файл и оставляет уже существующий файл в покое.
Ваш симптом подразумевает, что вы изначально скомпилировали синтаксически правильную версию вашей программы, после чего компиляция не удалась из-за синтаксической ошибки, что привело к последующему вызову ./warning
для вызова двоичного файла, полученного в результате более ранней компиляции синтаксически правильной версии программы.
Что касается появления предупреждений во время компиляции, основываясь на полезных комментариях:
Даже если все предупреждения включены (-Wall -Wextra
), предупреждение не выдается, если вы удалите оператор return
из функции main()
, а именно:
Удаление
return
изmain()
соответствует требованиям и не должно вызывать предупреждений или ошибок.int main()
— единственная непустая функция, от которой не требуется явно возвращать значение.
Таким образом, если вы добавили, скажем, int other() { }
в свою программу, вы увидите предупреждение, а именно:
warning: non-void function does not return a value [-Wreturn-type]
Обратите внимание, что предупреждение -Wreturn-type
подразумевается -Wall , тогда как -Wextra включает дополнительные предупреждения.
Спасибо, теперь я понял! Ваши дополнительные заметки были особенно полезны.
Хорошее начало —
-Wall -Wextra
, но полную информацию смотрите в документации.