стандарт C++ запрещает основную пустоту () прототип?

В разделе 3.6.1.2 из обоих Стандартов C++ выпуски 1998 и 2003 годов,

Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Это должно иметь тип возврата интервала типа, но иначе его тип определяется реализацией.

Я не носитель английского языка. Я не делаю уверенный, что делает, "но иначе" означает. Должно ли это запретить другой тип возврата, или дать право разработчику компилятора C++?

Таким образом, каков ответ?

6
задан Lightness Races with Monica 25 January 2012 в 16:40
поделиться

6 ответов

Процитированный вами английский язык запрещает объявление main для возврата void . Это позволяет варьировать входящие аргументы, но не возвращаемый тип.

12
ответ дан 8 December 2019 в 05:55
поделиться

Ага! Да, это так. Единственный тип возвращаемого значения, разрешенный стандартом, - это int. Цитата из раздела 3.6.1:

Он должен иметь возвращаемый тип типа int, но в остальном его тип определяется реализацией.

означает, что это может выглядеть так:

int main( float f );
int main( int x, int y );

и т. д. и т. д.

7
ответ дан 8 December 2019 в 05:55
поделиться

Тип содержит не только возвращаемый тип. Следовательно, тип возвращаемого значения должен быть int, но вы можете свободно рассматривать оставшийся аргумент, т.е. вы можете, например, выбрать между

int main()

и

int main(int argc, char **argv)
2
ответ дан 8 December 2019 в 05:55
поделиться

Стандарт гласит, что возвращаемый тип должен быть 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 ** яблоко)
1
ответ дан 8 December 2019 в 05:55
поделиться

Что касается параметров, то он позволяет

  1. int main ()

  2. int main (int argc, char * argv [])

  3. int main (int argc, char * argv [], char * envr [])

Но согласно стандартному типу возвращаемого значения должно быть int для обеспечения согласованности.

0
ответ дан 8 December 2019 в 05:55
поделиться

Цель состоит в том, чтобы сказать, что аспекты типа функции main , отличные от типа возврата, определяются реализацией. Это означает, что это объявление разрешено этим разделом стандарта:

int main(int fred, char *bouncy);

, но не этим:

void main(int fred, char *bouncy);

Его возвращаемый тип должен быть int , но реализация может иметь разные типы аргументов.

0
ответ дан 8 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: