Это брало их достаточно долго для добавления поддержки этого,
Если вы разрабатываете встроенную систему, вы можете увидеть другие имена.
ECos использует
cyg_user_start().
(или main (), в зависимости от настройки).
Модуль ядра Linux использует функцию, помеченную как __init (хотя это не одно и то же, поскольку модули обычно управляются событиями) .
Потому что он ничем не хуже других . Другой способ - использовать безымянный блок, как в Паскале и его производных, или в большинстве языков сценариев, где «основная функция» (если ей разрешено так ее называть) является только началом файла. Затем вам нужно позаботиться о том, откуда вы получаете аргументы программы (некоторая библиотека или глобальная переменная), и вы можете спросить, почему они выбрали args
вместо arguments
или argv
или param
и т. Д.
С уважением,
К сожалению, я не могу (пока) напрямую комментировать, поэтому мне придется дать полный ответ, вообще не зная ответа на ваш вопрос.
Но, однако, , Я хотел бы обратить ваше внимание на всех, кто говорит: «А что, кроме main () , все равно должно было стать?» что в действительности в именованной функции нет необходимости. Это вполне могло быть {}
с условием, что код в этих анонимных скобках является основной функцией, и все. (Таким образом, это не только подразумевает int
, когда тип возвращаемого значения отсутствует, но также подразумевает, так сказать, main ()
, когда имя функции отсутствует.)
Ну, либо у него должно быть фиксированное имя, либо вы должны дать программисту способ указать имя.
Если бы программист мог выбрать имя, тогда бы он должно быть дополнительным выражением или какой-либо особенностью языка, чтобы справиться с этим. И что от этого получится? Возможно, нам было бы хуже: тогда, когда вы захотите найти эту функцию, вам сначала нужно будет найти то, что говорит о том, что она вызывает, затем вам придется искать саму функцию, так что будет два шагов вместо единицы.
Учитывая, что у него будет фиксированное имя, кто-то должен был выбрать, каким будет это имя. Можно было придумать много кандидатов: «старт», «бег», да что угодно. Я сомневаюсь, что была какая-то основная причина, по которой был выбран «основной». Кто-то должен был что-то выбрать,
Надо как-нибудь это назвать. И я не могу придумать лучшего названия, так как именно здесь начинается основной поток программы.
Нет общей структуры, кроме, возможно, возможности принимать аргументы. Не должно быть и общей структуры, поскольку весь смысл программы - делать все, что хочет программист. То есть что угодно.
Разработчикам языка пришлось выбрать "какое-то" имя, и main () звучит как функция Main, так как именно там начинается выполнение :)
Вероятно, потому, что должна выполняться основная функция. C ++ унаследовал это имя от C, а Java унаследовал его от C ++ (программисты не любят изменений).
Вы так близко подошли к некоторым вопросам, что были бы почти интересны ...
основной
частью язык или библиотека? main ()
? main ()
? main ()
? main ()
к чему-то более крутому? Поскольку это сделал C, C ++ сохранил его для совместимости, а Java сделала это, чтобы облегчить переход от C ++. Еще на заре Java работодатели часто нанимали людей, которые имели опыт работы с C ++, потому что он был очень похож. В отличие от сегодняшнего дня, когда они хотят, чтобы новичок имел больше опыта работы с Java, чем Гослинг.
И давайте не будем забывать, что PL / 1 использовала «основные параметры процедуры» для той же цели. (Чувак, это освежает некоторые ячейки памяти, к которым давно не прикасались!)
Обратите внимание, что хотя имя main
является своего рода условным обозначением, вы можете называть свою функцию ввода как хотите, если вы указываете компоновщику , что точка входа на самом деле есть. См. Этот фрагмент из man ld
:
-e entry --entry=entry Use entry as the explicit symbol for beginning execution of your program, rather than the default entry point. If there is no sym- bol named entry, the linker will try to parse entry as a number, and use that as the entry address (the number will be interpreted in base 10; you may use a leading 0x for base 16, or a leading 0 for base 8).
Кроме того, FWIW, ld
первый выбор точки входа (иногда) является фактически вызываемой функцией _start
(но я думаю, что это действительно зависящее от платформы значение).
И см. это сообщение , которое добавляет немного больше объяснений к ld
] -e
параметр:
-e
дает замену для_start
, а неmain ()
. Ты должен знать как среда выполнения системы передает аргументы программе и дублирует некоторые функции crt [01in] .o и crt {begin, end} .o для вызова main.
Я не могу найти, где это задокументировано на странице руководства gcc, но вы также можете передать -e
в gcc, чтобы указать точку входа; однако это оказывается довольно сложной задачей, если вы обойдете магию C main
.
$ cat junk.c int junk() { return 8; } $ gcc -nostdlib -e _junk junk.c -o junk && (./junk; echo $?) 8
Потому что это основная функция. Термин основная функция используется по крайней мере с 1960-х годов. В PL / I функция, которая начала выполнение, имела следующий заголовок:
FOO: PROCEDURE OPTIONS(MAIN);
, где FOO
- имя функции.
Здесь много глупых и не очень уважительных ответов на законный вопрос.
C пришел не из ниоткуда . Его непосредственный предок - B, написанный Кеном Томпсоном. Вот ссылка на руководство B . Базовая структура B-программы - это
main (); exit ();
main () предоставляется программистом, а exit () предоставляется библиотекой. Кажется, это первое появление main (), поскольку предшественник B, BCPL, не имеет такой концепции. Думаю, вам стоит спросить Кена Томпсона, почему это главное, а не что-то еще.
потому что C, C ++ и Java нуждались в способе узнать, где находится главная функция ...
однако многие другие языки позволяют называть ее так, как вам нравится, и есть способ сообщить компилятору, какая функция является точкой входа (параметр компилятора, прагма, специальный оператор ...).
Быстрые ответы:
Лично я считаю, что ответы на вопросы 2a и 2b являются наиболее важными. Если вы действительно хотите сломать каждую программу на C / C ++ / Java в мире, чтобы исправить то, что, по вашему мнению, является несовершенной эстетикой одного имени функции, я должен спросить вас, правильно ли вы расставили приоритеты ....; -)
Это не всегда main ().
Апплеты Java используют init () и start () для подключения внешнего вызывающего абонента.
Сервлеты запускаются через init () и service () методы.
(служба будет отправлять более знакомые методы doGet и doPost)
Конечно, эти исключения полагаются на некоторый контейнер, отличный от ОС, для вызова методов.
Или, если быть более тупым, почему мы едем по обочине дороги?
Ответ: Мы должны были что-то выбрать.