запрещает ли стандарт С++ прототип void main()?

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

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

Я не являюсь носителем английского языка. Я не уверен, что означает «но иначе». Является ли это запретом другого типа возврата или предоставлением права автору компилятора С++?

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


person Jichao    schedule 16.12.2009    source источник


Ответы (6)


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

person bmargulies    schedule 16.12.2009
comment
Это любимая тема для участников групп новостей. Однако можно ли привести возвращаемый тип main к void? - person Thomas Matthews; 16.12.2009
comment
Извините, я не слежу за вашим вопросом. Где бы вы могли получить возвращаемый тип main? - person bmargulies; 16.12.2009
comment
@bmargulies: в другой программе C, которая принимала результат первой программы в качестве входных данных? Тем не менее, странный вопрос. - person Adriano Varoli Piazza; 16.12.2009
comment
@bmargulies, main может быть рекурсивной функцией или может вызываться какой-то другой частью программы. - person Kevin; 17.12.2009
comment
@Kevin, вы уверены, что main() может быть рекурсивным в стандартном C/C++? Кроме того, откуда еще в программе вы могли бы вызвать main на C/C++? Это не Ява. - person Adriano Varoli Piazza; 17.12.2009
comment
@ Адриано, хороший улов, +1 тебе. Рекурсивный main является допустимым C, но особенно незаконным C++ (хотя я использовал компиляторы, которые это разрешают), и это вопрос C++. - person Kevin; 18.12.2009

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

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

то есть это может выглядеть так:

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

и т.д.

person Community    schedule 16.12.2009

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

int main()

а также

int main(int argc, char **argv)
person Frank    schedule 16.12.2009
comment
или int main( int argc, char ** argv, char** env) в linux - person deft_code; 16.12.2009
comment
Но видимо требование компилятора. - person Martin York; 16.12.2009
comment
Стандарт С++ не запрещает дополнительные аргументы (хотя две приведенные вами подписи должны быть разрешены), поэтому Caspin корректен для некоторых компиляторов. Это запрещает void main(). - person David Thornley; 16.12.2009

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

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

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

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

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 **apple)
person Kevin    schedule 16.12.2009

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

  1. основной ()

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

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

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

person Ashish    schedule 16.12.2009
comment
Номер 3 не требуется стандартом C++. - person ; 16.12.2009
comment
Третья разрешена, но не требуется стандартом C++, наряду с бесконечным множеством других возможных подписей. Первый и второй должны быть разрешены соответствующим компилятором. - person David Thornley; 16.12.2009
comment
Будет ли справедливо сказать, что стандарт позволяет main принимать любой набор параметров помимо первых двух, но доступ к любым дополнительным параметрам будет либо поведением, определяемым реализацией (если реализация их определяет), либо поведением Undefined Behavior (если это не так? ) - person supercat; 30.09.2010

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

int main(int fred, char *bouncy);

но не этот:

void main(int fred, char *bouncy);

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

person Omnifarious    schedule 16.12.2009