Тип возврата main () под компилятором GNU g ++ - PullRequest
1 голос
/ 01 апреля 2019

Согласно ISO_14882_2014

3.6 Начало и окончание [basic.start]

3.6.1 Основная функция [basic.start.main]

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

но в остальном его тип определяется реализацией. Это означает, что компилятор может иметь свой собственный тип возврата для main(). Можете ли вы указать мне место, где компилятор GNU G ++ говорит о типе возврата main().

Ответы [ 2 ]

4 голосов
/ 01 апреля 2019

Тип возврата должен быть int;«его тип», который следует, относится к main, а не к возвращаемому типу.То есть аргументы, которые принимает main, определены реализацией.Однако каждая реализация должна обеспечивать не менее int main() и int main(int, char**).

1 голос
/ 01 апреля 2019

Предполагая архитектуру i386. С glibc start. S мы называем __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 **). Из-за того, как стек работает на i386, будут работать формы int main(void) и int main() и int main(int) и int main(int, char**). Возвращаемый тип main int.

...