#c #g
#c #g
Вопрос:
Согласно ISO_14882_2014
3.6 Запуск и завершение [basic.start]
3.6.1 Основная функция [basic.start.main]
2 Реализация не должна предопределять функцию main. Эта функция не должна быть перегружена. Он должен иметь объявленный возвращаемый тип типа int, но в остальном его тип определяется реализацией.
но в остальном его тип определяется реализацией. Это означает, что компилятор может иметь свой собственный возвращаемый тип для main()
. Не могли бы вы указать мне место, где компилятор GNU G сообщает о main()
возвращаемом типе.
Комментарии:
1. как насчет документации ?
2. «В противном случае» применяется к типам параметров IIUC
3. В том, что вы нашли, указано, что он должен иметь объявленный возвращаемый тип типа int . Это полная остановка.
main
всегда должен возвращатьint
из-за этого предложения. Это параметры, которые определяются реализацией.4. Я понимаю. запятая (,) после
return type of type int,
вводит в заблуждение.5. @UjjwalKumar Не совсем. «но в противном случае» означает «за исключением этого», а не «альтернативно».
Ответ №1:
Возвращаемый тип должен быть int
; «его тип», который следует ниже, относится к main
, а не к возвращаемому типу. То есть аргументы, которые main
принимают, определены реализацией. Однако каждая реализация должна предоставлять по крайней мере int main()
и int main(int, char**)
.
Комментарии:
1. Спасибо за ответ. Запятая перед определенной реализацией строкой вводит в заблуждение
Ответ №2:
Предполагается архитектура i386. Из запуска glibc. Мы вызываем __libc_start_main
. Из glibc csu / libc-start.c __libc_start_main мы вызываем main
с типом указателя int (*main) (int, char **, char **)
( MAIN_AUXVEC_DECL
я думаю, что он не должен быть определен на i386, только для powerpc). Таким образом, тип main
функции, определенный реализацией, является int main(int, char **, char **)
. Из-за того, как работает stack на i386, формы int main(void)
и int main()
, и int main(int)
и int main(int, char**)
будут работать. main
Возвращаемый тип является int
.