TL; DR: определите функцию main()
, и ваша программа будет работать.
Из спецификации C C11 (ISO / IEC 9899: 201x / N1548)
5.1.2 Среды исполнения
Определены две среды выполнения: автономные и hosted .
[...]
5.1.2.1 Отдельно стоящее окружение
В автономной среде (в которой выполнение программы на С может осуществляться без какой-либо выгоды от операционной системы), имя и тип функции, вызываемой при запуске программы, определяются реализацией.
[...]
5.1.2.2 Размещенная среда
[...]
5.1.2.2.1 Запуск программы
Функция, вызываемая при запуске программы, называется main
. [...]
* * +1032 Кроме того: * 1 033 *
J2 Неопределенное поведение
Поведение не определено в следующих обстоятельствах:
- [...]
- Программа в размещенной среде не определяет функцию с именем
main
, используя одну из указанных форм (5.1.2.2.1).
размещенная среда
Скорее всего, это ваш случай.
Это относится к типичным операционным системам, таким как Linux, Unix, Mac OS X, Windows, Amiga OS и многим другим. В этом случае вашей средой обычно является размещенная среда.
Если вы запустите свой компилятор C и компоновщик без каких-либо опций, которые будут выбирать или влиять на среду, и если целью является такая типичная операционная система, и вы, наконец, сделаете ссылку, допущение, сделанное компилятором C и компоновщиком, будет размещенная среда. Как описано выше, это означает, что вам нужно предоставить функцию main()
, чтобы размещенная среда знала, где запустить вашу C-программу. Поскольку вы не предоставили функцию main
, применимо условие J2 Неопределенное поведение , и компоновщик отказался завершить свою работу.
Примечание. Эти операционные системы на самом деле предоставляют собственный настраиваемый интерфейс, см. Ниже.
Решение: Обеспечить функцию main()
.
Отдельно стоящая среда
Отдельно стоящие среды обычно возникают при самостоятельной разработке прошивки или операционной системы. В этом случае точка входа определяется процессором. Большинство процессоров начнут выполнение по заранее заданному адресу или по конфигурируемому адресу, считанному из таблицы векторов, указанной по заранее определенному адресу.
Пользовательские среды
Кроме того, существуют пользовательские среды. Две наиболее распространенные пользовательские среды:
Типичная ОС
Чтобы иметь возможность делать больше, чем указано в спецификации C, операционные системы определяют свою собственную среду. Эта среда обычно является расширением размещенной среды и использует точку входа, указанную компоновщиком. Как правило, эта точка входа на самом деле является другой функцией, часто называемой _start
, которая предоставляется библиотекой по умолчанию, такой как libglibc. Эта функция _start
вызывается ОС, и эта функция _start
затем вызывает main
.
Таким образом, вместо предоставления main
можно было бы предоставить _start
или эквивалент, вместо этого.
Вы можете написать свою собственную _start
функцию или точку входа.
Однако это рискует тем, что ваша программа будет излишне менее переносимой, и вам придется решать проблемы операционной системы, которые скрытая от вас скрытая среда.
Поэтому не рекомендуется для «обычных» программ «нормальными» разработчиками.
DLL-окружения
Когда программы должны запускаться как плагины для других программ, эти другие программы определяют пользовательскую среду.
Как правило, эта пользовательская среда реализуется как DLL (Dynamic Link Library).
Встроенные среды
ДляВ некоторых встроенных системах наборы инструментов (компилятор и т. д.) поставляются с библиотеками, которые предоставляют настраиваемую среду для этой системы. Эти среды имеют функции, которые находятся где-то между автономной средой и размещенной средой, а точки входа зависят от соответствующей цепочки инструментов. Чтобы избежать путаницы, связанной с неожиданными именами точек входа, в цепочках инструментов обычно используются main
, start
, _start
, Start
или _Start
в качестве имен для точки входа.