В разделе 3.6.1.2 из обоих Стандартов C++ выпуски 1998 и 2003 годов,
Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Это должно иметь тип возврата интервала типа, но иначе его тип определяется реализацией.
Я не носитель английского языка. Я не делаю уверенный, что делает, "но иначе" означает. Должно ли это запретить другой тип возврата, или дать право разработчику компилятора C++?
Таким образом, каков ответ?
Процитированный вами английский язык запрещает объявление main
для возврата void
. Это позволяет варьировать входящие аргументы, но не возвращаемый тип.
Ага! Да, это так. Единственный тип возвращаемого значения, разрешенный стандартом, - это int. Цитата из раздела 3.6.1:
Он должен иметь возвращаемый тип типа int, но в остальном его тип определяется реализацией.
означает, что это может выглядеть так:
int main( float f );
int main( int x, int y );
и т. д. и т. д.
Тип содержит не только возвращаемый тип. Следовательно, тип возвращаемого значения должен быть int, но вы можете свободно рассматривать оставшийся аргумент, т.е. вы можете, например, выбрать между
int main()
и
int main(int argc, char **argv)
Стандарт гласит, что возвращаемый тип должен быть int
, но что остальная часть типа зависит от реализации. Например, вы можете создать соответствующий стандарту (но не очень полезный) компилятор C ++, который использовался.
int main(int secondsSinceSystemStart, int myFavoriteNumber, char* aFunnyJoke)
Из Wikipedia :
В C и C ++ прототип функции основной функции выглядит так: одно из следующих:
int main (void) int main (int argc, char ** argv)
Параметры argc, количество аргументов и argv, вектор аргументов, соответственно, дают количество и значение аргументов командной строки программы. Имена argc и argv могут быть любым допустимым идентификатором, но обычно используются эти имена. Другие платформенно-зависимые форматы также разрешены стандартами C и C ++; например, Unix (но не POSIX.1) и Microsoft Visual C ++ имеют третий аргумент, указывающий среду программы, в противном случае доступную через getenv в stdlib.h:
int main (int argc, char ** argv, char ** envp)
Mac OS X и Darwin имеют четвертый параметр, содержащий произвольную информацию, предоставленную ОС, такую как путь к исполняемому двоичному файлу:
int main (int argc, char ** argv, char ** envp, char ** яблоко)
Что касается параметров, то он позволяет
int main ()
int main (int argc, char * argv [])
int main (int argc, char * argv [], char * envr [])
Но согласно стандартному типу возвращаемого значения должно быть int для обеспечения согласованности.
Цель состоит в том, чтобы сказать, что аспекты типа функции main
, отличные от типа возврата, определяются реализацией. Это означает, что это объявление разрешено этим разделом стандарта:
int main(int fred, char *bouncy);
, но не этим:
void main(int fred, char *bouncy);
Его возвращаемый тип должен быть int
, но реализация может иметь разные типы аргументов.