Как понять, что "прототип основной функции не может быть предоставлен программой"?

Я прочитал main function и наткнулся на следующие слова:

Функция main имеет несколько специальных свойств:

  1. Программа не может предоставить прототип этой функции.

Затем я написал простую программу:

# cat foo.c
int main(void);

int main(void)
{
    return 0;
}

И скомпилировал его:

# gcc -Wall -Wextra -Wpedantic -Werror foo.c
#

Все вроде нормально! Поэтому я немного запутался в том, как понять «Прототип этой функции не может быть предоставлен программой». Кто-нибудь может дать некоторые идеи?

Стандарт C не имеет такой спецификации. В нем говорится, что реализация не предоставляет прототипа для main(), но не говорится, что его не может быть в самой программе.

Barmar 21.11.2022 10:10
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
3
1
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

main параметры функции и возвращаемое значение определены стандартом. Вы не должны предоставлять свой собственный. Но компилятор может принимать и компилировать даже нестандартные типы main.

С другой стороны, функция main не будет вызываться вашим кодом, поэтому ваш прототип вообще не нужен.

C позволяет вызывать основную функцию из другого пользовательского кода.

Barmar 21.11.2022 10:09

"Но компилятор примет и скомпилирует даже нестандартные типы main" Ну может быть? Компилятор может свободно поддерживать форматы, определенные реализацией, которые он должен документировать. И тогда программист может использовать эти предоставленные форматы. Компилятору не нужно поддерживать какого-то сумасшедшего программиста, изобретающего свои собственные форматы main - такие форматы main, явно не документированные/поддерживаемые компилятором, являются неопределенным поведением.

Lundin 21.11.2022 10:13
Ответ принят как подходящий

Стандарт C (5.1.2.2.1) просто говорит, что компилятор (для размещенных систем, таких как ПК и т. д.) не предоставит прототип функции main. Таким образом, cppreference.com не совсем корректен, стандарт C не запрещает разработчику приложения писать прототип, хотя это, вероятно, бессмысленная практика в размещенных системах.

В автономных системах (встроенных системах и т. д.) может иметь смысл объявить прототип для main на случай, если его нужно будет вызывать из сброса ISR или из «среды выполнения C» (CRT).

Важно понимать, что независимо от системы компилятор указывает, какие формы main являются допустимыми. Никогда не программист.

Другие вопросы по теме