стандарт c ++ запрещает прототип void main ()? - PullRequest
6 голосов
/ 16 декабря 2009

В разделе 3.6.1.2 выпусков C ++ Standard 1998 и 2003,

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

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

Так, каков ответ?

Ответы [ 6 ]

12 голосов
/ 16 декабря 2009

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

7 голосов
/ 16 декабря 2009

Aaargh! Да, это так. Единственный тип возврата, разрешенный стандартом, это int. Цитировать из раздела 3.6.1:

Должен иметь тип возврата типа int, но в противном случае его тип реализации.

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

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

и т.д.. и т.д.

2 голосов
/ 16 декабря 2009

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

int main()

и

int main(int argc, char **argv)
1 голос
/ 16 декабря 2009

Стандарт гласит, что тип возвращаемого значения должен быть int, но остальная часть типа зависит от реализации. Например, вы могли бы сделать совместимый со стандартом (но не очень полезным) компилятор C ++, который бы использовал.

int main(int secondsSinceSystemStart, int myFavoriteNumber, char* aFunnyJoke)

Из Википедия :

В C и C ++ прототип функции основной функции выглядит следующим образом:

int main(void)
int main(int argc, char **argv)

Параметры argc, count аргумента и 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 **apple)
0 голосов
/ 16 декабря 2009

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

int main(int fred, char *bouncy);

но не этот:

void main(int fred, char *bouncy);

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

0 голосов
/ 16 декабря 2009

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

  1. int main ()

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

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

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

...