Является ли main() определяемой пользователем функцией?

В конце концов, программист действительно определяет, что происходит внутри main().

Итак, следует ли считать ее определяемой пользователем функцией?


person Maxpm    schedule 15.01.2011    source источник
comment
Если это user-defined function, то я смогу его вызвать. Итак, можете ли вы сами вызвать main() в своем коде?   -  person Mahesh    schedule 15.01.2011
comment
@Mahesh Нельзя ли то же самое сказать о библиотечных функциях?   -  person Maxpm    schedule 15.01.2011
comment
@Fritschy Я никогда не знал, что пользователь может вызывать main, и просто думал, что это программа входа для выполнения программы. Только что попробовал - warning C4717: 'main' : recursive on all control paths, function will cause runtime stack overflow , Спасибо за информацию.   -  person Mahesh    schedule 15.01.2011
comment
@Fritschy: Какое значение здесь имеет стандарт C?   -  person Lightness Races in Orbit    schedule 15.01.2011
comment
@Fritschy, @Mahesh: Нет, вы не можете звонить main. См. 3.6.1 в C++03.   -  person Lightness Races in Orbit    schedule 15.01.2011
comment
@Mahesh Откуда ты это назвал? Конечно, это будет рекурсивно, если вы просто поместите вызов в main или даже в функцию, которую вызывает main, если только вы не поместите где-нибудь оператор if.   -  person Maxpm    schedule 15.01.2011
comment
@Fritschy: Очевидно, нет, поскольку вы только что утверждали обратное. Интересно, кто проголосовал за эту фактическую ошибку!   -  person Lightness Races in Orbit    schedule 15.01.2011
comment
@Paul Определенно не вопрос домашнего задания/интервью для меня. Я сделал поиск, но результаты ничего не показали для С++.   -  person Maxpm    schedule 15.01.2011
comment
@Maxpm: похоже, тот же вопрос часто возникает в таких местах, как Yahoo Answers — я всегда предполагал, что это должно быть что-то из курса индийского колледжа или что-то в этом роде — может быть, из одной из тех ужасных книг Kanetekar C/C++.   -  person Paul R    schedule 15.01.2011
comment
@PaulR: Какое отношение Индия имеет к чему-либо?   -  person Lightness Races in Orbit    schedule 16.01.2011
comment
@Tomalak: потому что все индийские колледжи, кажется, основывают свои курсы C / C ++ на книгах Канеткара, и поэтому весь плохой материал в этих книгах передается от одного поколения индийских выпускников к другому.   -  person Paul R    schedule 16.01.2011


Ответы (7)


В стандарте C++ нет понятия пользовательских функций. Вместо этого в нем используется понятие библиотечных функций. main не является библиотечной функцией. Однако стандарт также налагает некоторые требования на его сигнатуру, а также на то, что он не должен быть перегружен или объявлен статическим или встроенным. В частности, его нельзя использовать, что означает, что вы не можете его вызывать.

Изменить: изначально я проверял только стандарт C. Теперь я также проверил стандарт С++, и он использует «определяемый пользователем» в следующих контекстах: операторы, типы, преобразования и библиотеки. Он также имеет объявленные пользователем пространства имен, объявленные пользователем конструкторы (по умолчанию и копирование) и написанные пользователем конструкторы по умолчанию. У него есть «пользовательские функции» в 27.1.1.

person Martin v. Löwis    schedule 15.01.2011
comment
Хорошо для стандарта C. Теперь давайте ответим на вопрос, который относится к C++. - person Puppy; 15.01.2011
comment
[Предположим, вы имеете в виду C++.] Или статический. Есть куча требований; 3.6.1 в '03 перечисляет их все. - person Lightness Races in Orbit; 15.01.2011
comment
@DeadMG: я пропустил это; Теперь я обновил ответ для С++. - person Martin v. Löwis; 15.01.2011
comment
Вам нельзя звонить main()? Где это сказано? - person fuz; 11.12.2014
comment
3.6.1p3: Функция main не должна использоваться в программе. Это продолжается Связь (3.5) main определяется реализацией. Программа, определяющая main как удаленную или объявляющая main встроенной, статической или constexpr, является некорректной. - person Martin v. Löwis; 14.12.2014

Yes-main — это определяемая пользователем функция. Самый простой способ думать об этом — определить пользователем, но объявить стандартом.

Есть у него и другие ограничения, например, нерекурсивность. Однако в некоторых компиляторах, таких как MSVC, допускается рекурсия в main(). Я нахожу это довольно удобным.

person Puppy    schedule 15.01.2011
comment
‹quote›Я нахожу это довольно удобным.‹/quote› Это страшно, поскольку ваш код теперь не соответствует требованиям. Таким образом, это не совсем программа на C++. - person Martin York; 15.01.2011
comment
Мой код имеет гораздо большие проблемы с соответствием, чем рекурсия в main. Нонконформизм — это не то, чего следует бояться, это то, к чему следует относиться осмотрительно, как и ко всему остальному. - person Puppy; 15.01.2011
comment
что??? зачем вам рекурсивно main??? - person BЈовић; 15.01.2011
comment
@VJo Много причин. Не нужно заморачиваться по этому поводу. - person Maxpm; 15.01.2011
comment
@Maxpm Можете ли вы назвать один? - person BЈовић; 16.01.2011
comment
@VJo Альтернатива циклу. - person Maxpm; 17.01.2011
comment
@Maxpm Вызов main не только очень плохая практика, но и запрещен стандартом С++. - person BЈовић; 17.01.2011

Если это не определяемая пользователем функция, то что это будет? Явно не функция ядра или библиотеки? Не уверен, что понимаю, к чему ты клонишь...

person Jeff    schedule 15.01.2011

Функция main не является ни встроенной (предопределенной), ни определяемой пользователем функцией. Это исключение, и вы должны соблюдать связанные с ним требования, изложенные в стандарте C++ (например, о его наличии в программе, типе возвращаемого значения и аргументах).

person Bojan Komazec    schedule 15.01.2011

main() не является предопределенной или встроенной функцией. Это определяемая пользователем функция с предопределенным прототипом функции (также называемой сигнатурой функции). Пользователь пишет его функционал, но его объявление имеет определенные ограничения.

person sanchit tandon    schedule 23.02.2014
comment
Слово шаблон имеет особое значение в C++, и это не так. И, пожалуйста, не используйте для себя аббревиатуры вроде u; они просто затрудняют чтение. - person Keith Thompson; 23.02.2014

main() не является ни определяемой пользователем, ни встроенной библиотечной функцией.

При попытке скомпилировать программу C в исполняемый файл компилятор ищет функцию с именем main в вашем списке исходных кодов.

Однако создание библиотеки (либо в виде общего объекта, либо путем предоставления необходимых заголовочных файлов) имеет разные последствия.

Просто чтобы вы знали, GCC ищет main с любой из следующих подписей:

int main(int, char **);

OR

int main();

person Community    schedule 02.09.2017

main() — это предопределенная функция, с которой начинается выполнение кода. Если у вас нет основной функции, программа не запустится. Следовательно, main является отправной точкой программы.

person gargi    schedule 10.09.2011
comment
Это определяемая пользователем функция с некоторыми ограничениями на ее сигнатуру. - person valkyrie55; 21.08.2019