Я прочитал main function и наткнулся на следующие слова:
Функция main имеет несколько специальных свойств:
- Программа не может предоставить прототип этой функции.
Затем я написал простую программу:
# cat foo.c
int main(void);
int main(void)
{
return 0;
}
И скомпилировал его:
# gcc -Wall -Wextra -Wpedantic -Werror foo.c
#
Все вроде нормально! Поэтому я немного запутался в том, как понять «Прототип этой функции не может быть предоставлен программой». Кто-нибудь может дать некоторые идеи?
main
параметры функции и возвращаемое значение определены стандартом. Вы не должны предоставлять свой собственный. Но компилятор может принимать и компилировать даже нестандартные типы main
.
С другой стороны, функция main
не будет вызываться вашим кодом, поэтому ваш прототип вообще не нужен.
C позволяет вызывать основную функцию из другого пользовательского кода.
"Но компилятор примет и скомпилирует даже нестандартные типы main" Ну может быть? Компилятор может свободно поддерживать форматы, определенные реализацией, которые он должен документировать. И тогда программист может использовать эти предоставленные форматы. Компилятору не нужно поддерживать какого-то сумасшедшего программиста, изобретающего свои собственные форматы main
- такие форматы main
, явно не документированные/поддерживаемые компилятором, являются неопределенным поведением.
Стандарт C (5.1.2.2.1) просто говорит, что компилятор (для размещенных систем, таких как ПК и т. д.) не предоставит прототип функции main
. Таким образом, cppreference.com не совсем корректен, стандарт C не запрещает разработчику приложения писать прототип, хотя это, вероятно, бессмысленная практика в размещенных системах.
В автономных системах (встроенных системах и т. д.) может иметь смысл объявить прототип для main
на случай, если его нужно будет вызывать из сброса ISR или из «среды выполнения C» (CRT).
Важно понимать, что независимо от системы компилятор указывает, какие формы main
являются допустимыми. Никогда не программист.
Стандарт C не имеет такой спецификации. В нем говорится, что реализация не предоставляет прототипа для
main()
, но не говорится, что его не может быть в самой программе.