стандарт (ISO/IEC 9899-2011) говорит о main
:
5.1.2.2.1 запуска программы
Функция вызывается в запуск программы называется main. Реализация не объявляет прототип для этой функции. Она должна быть определена с типом возвращаемого междунар и без каких-либо параметров:
int main(void) { /* ... */ }
или с двумя параметрами (именуемых здесь как ARGC и ARGV, хотя любые имена могут быть использованы , так как они являются локальными в функция, в которой они заявлены):
int main(int argc, char *argv[]) { /* ... */ }
или его эквивалент;
Это значит, что все это заканчивается?
Нет, не так просто. В конце цитаты стоит небольшая точка с запятой, и вот что представляет собой эта маленькая, казалось бы, невиновная часть
или каким-либо другим способом реализации.
чем есть разница между «прошел» (раздел 5.1.2.2 в пределах операционной системы и ее правил) и «Свободностоящих» (в разделе 5.1.2.1. Например, на небольшой ПОС или аналогичных, едва каких-либо правил на всех, и остальное определяется реализация)
синтаксис определения функции определен в разделе 6.9.1, где он читает в пункте 1
идентификатор, объявленный в определении функции (которое является именем функции) должен иметь тип функции, как определено частью декларатора определения функции.
Далее подробно описано в пункте 2
Тип возврата функции считается недействительным или полного типа объекта, отличного типа массива.
Поэтому любое определение функции (включая main
) должно иметь заданный тип возврата.
Но см. Правила для «автономной среды» выше или лучше, их отсутствие.
Есть ли причина, по которой вы или ваш друг хотите использовать нестандартный синтаксис определения функции? – MikeCAT
Причиной может быть опция '-Werror' или что-то в этом роде. Не могли бы вы разгадать вариант командной строки? – MikeCAT
@MikeCAT У меня нет причин, но по умолчанию возвращаемый тип int, поэтому мы написали это. Но я хочу знать, что такое ошибка, Не интересуется компиляцией –