Определением функции является также объявление функции.
цель объявления функции состоит в том, чтобы сделать известным компилятору. Объявление функции, не определяя его позволяет функции использоваться в местах, где это неудобно для определения его. Например:
B.h
). В C++, пользовательская программа никогда не звонит main
, таким образом, этому никогда не нужно объявление перед определением. (Обратите внимание, что Вы могли обеспечить тот, если бы Вы желали. Нет ничего специального об объявлении main
в этом отношении.) В C программа может звонить main
. В этом случае это действительно требует, чтобы объявление было видимо перед вызовом.
Примечание, которое main
действительно должно быть известно коду, который называет его. Это - специальный код в том, что обычно называют кодом запуска среды выполнения C++. Компоновщик включает тот код для Вас автоматически, когда Вы связываете программу C++ с соответствующими опциями компоновщика. Безотносительно языка, в котором написан код, он имеет любое объявление main
, ему нужно для вызова его правильно.
мне преподавали, что для функций нужны объявления, которые назовут.
Действительно. Функция должна быть объявлена, прежде чем это можно будет назвать.
, почему мы не добавляем объявление для эти
main
функция?
ну, Вы не звонили main
функция. На самом деле Вы не должны звонить main
во всем <глоток> 1 глоток>, таким образом, никогда нет потребности объявить main
перед чем-либо.
Технически, хотя, всеми определениями являются также объявления, таким образом, Ваше определение main
также объявляет main
.
Сноска 1: в стандарте C++ говорится, что это - неопределенное поведение звонить main
из программы.
Это позволяет реализациям C++ помещать специальное выполнение однажды код запуска наверху основного, если они не могут иметь выполненный ранее от рычагов в коде запуска, который обычно звонит main
. Некоторые реальные реализации действительно на самом деле делают это, например, вызов быстрой математической функции, которая устанавливает некоторые флаги FPU как denormals-are-zero.
На гипотетической реализации, называя основным мог привести к забавным вещам как повторно выполняющиеся конструкторы для всех статических переменных, повторно инициализировав структуры данных, используемые new
/ delete
для отслеживания выделения или другую общую поломку программы. Или это не могло бы вызвать проблему вообще. Неопределенное поведение не означает, что имеет для сбоя на каждой реализации.
Прототип требуется, если Вы хотите вызвать функцию, но это еще не доступно, как sum
в Вашем случае.
Вы не должны звонить main
сами, таким образом, нет никакой потребности иметь прототип. Это - даже плохое идея записать прототип.
нет, для компилятора не нужно предописание для main()
.
main()
специальная функция в C++.
Некоторые важные вещи помнить об основном ():
main()
функция существовала при создании исполняемой программы. int main () { /* body */ }
int main (int argc, char *argv[]) { /* body */ }
, где body
нуль или больше операторов
, дополнительная приемлемая форма является конкретной реализацией и предоставляет список переменных среды в то время, когда функция вызвана:
int main (int argc, char* argv[], char *envp[]) { /* body */ }
кодер должен предоставить 'определение' основного использования одной из этих приемлемых форм, но кодер не должен обеспечивать объявление. Кодированное определение принято компилятором как объявление основных ().
return 0;
как последний оператор в теле функции. Как в стороне, иногда существует беспорядок о том, может ли программа C++ позвонить основному (). Это не рекомендуется. C++ 17 проектов указывают, что основной () "не буду использоваться в рамках программы". Другими словами, не может быть назван из программы. Посмотрите, например, Рабочий Черновой Стандарт для Языка Программирования на C++, датированного "2017-03-21", Абзац 6.6.1.3, страница 66 . Я понимаю, что некоторые компиляторы поддерживают это (включая мой), но следующая версия компилятора могла изменить или удалить то поведение, поскольку стандарт использует термин, "буду не".
Это недопустимо для вызова main
из программы. Это означает единственную вещь, которая собирается звонить, это - время выполнения, и компилятор/компоновщик может обработать установку этого. Это означает, что Вам не нужен прототип для main
.
Определение функции также неявно объявляет это. Если необходимо сослаться на функцию, прежде чем она будет определена, необходимо объявить это перед использованием ее.
Настолько пишущий следующее также допустимо:
int sum(int x, int y) {
return x + y;
}
int main() {
std::cout << "The result is " << sum(1, 2);
return 0;
}
при использовании объявления в одном файле для создания функции известной компилятору, прежде чем это будет определено, затем его определение должно быть известно при соединении времени:
main.cpp
int sum(int x, int y);
int main() {
std::cout << "The result is " << sum(1, 2);
return 0;
}
sum.cpp
int sum(int x, int y) {
return x + y;
}
Или sum
мог возникнуть в библиотеке, таким образом, Вы даже не компилируете его сами.
Эти main
функция не используется/ссылается в Вашем коде нигде, таким образом, нет никакой потребности добавить объявление main
где угодно.
Прежде и после Вашего main
функционируют, библиотека C++ могла бы выполнить некоторый init и шаги очистки, и назовет Ваш main
функция. Если бы та часть библиотеки была бы представлена как код C++ затем, это содержало бы объявление int main()
так, чтобы это это могло быть скомпилировано. Тот код мог быть похожим на это:
int main();
int __main() {
__startup_runtime();
main();
__cleanup_runtime();
}
, Но затем у Вас снова есть та же проблема с [1 110] так в какой-то момент нет никакого C++ больше, и определенная функция (main
) просто представляет точку входа Вашего кода.
Нет. Вы не можете назвать его так или иначе.
Вам только нужны предописания для функций, вызванных, прежде чем они будут определены. Вам нужны внешние объявления (которые точно походят на предописания нарочно) для функций, определяемых в других файлах.
, Но Вы не можете звонить main
в C++, таким образом, Вам не нужен тот. Это вызвано тем, что компилятору C++ позволяют изменить основной, чтобы сделать глобальную инициализацию.
[я посмотрел на crt0.c, и он действительно имеет объявление для основного, но это ни здесь, ни там].