62
задан 19 July 2019 в 16:55

7 ответов

Определением функции является также объявление функции.

цель объявления функции состоит в том, чтобы сделать известным компилятору. Объявление функции, не определяя его позволяет функции использоваться в местах, где это неудобно для определения его. Например:

  • , Если функция используется в исходном файле (A) кроме того, это определяется в (B), мы должны объявить это в (обычно через заголовок, который A включает, такой как B.h).
  • , Если две или больше функции могут назвать друг друга, то мы не можем определить все те функции, прежде чем others— один из них должен быть первым. Таким образом, объявления могут быть обеспечены сначала с определениями, появляющимися позже.
  • Многие люди предпочитают помещать “higher level” стандартные программы ранее в исходном файле и подпрограммах позже. Так как те “higher level” стандартные программы называют различные подпрограммы, подпрограммы должны быть объявлены ранее.

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

Примечание, которое main действительно должно быть известно коду, который называет его. Это - специальный код в том, что обычно называют кодом запуска среды выполнения C++. Компоновщик включает тот код для Вас автоматически, когда Вы связываете программу C++ с соответствующими опциями компоновщика. Безотносительно языка, в котором написан код, он имеет любое объявление main, ему нужно для вызова его правильно.

61
ответ дан 31 October 2019 в 13:16

мне преподавали, что для функций нужны объявления, которые назовут.

Действительно. Функция должна быть объявлена, прежде чем это можно будет назвать.

, почему мы не добавляем объявление для эти main функция?

ну, Вы не звонили main функция. На самом деле Вы не должны звонить main во всем <глоток> 1 , таким образом, никогда нет потребности объявить main перед чем-либо.

Технически, хотя, всеми определениями являются также объявления, таким образом, Ваше определение main также объявляет main.

<час>

Сноска 1: в стандарте C++ говорится, что это - неопределенное поведение звонить main из программы.

Это позволяет реализациям C++ помещать специальное выполнение однажды код запуска наверху основного, если они не могут иметь выполненный ранее от рычагов в коде запуска, который обычно звонит main. Некоторые реальные реализации действительно на самом деле делают это, например, вызов быстрой математической функции, которая устанавливает некоторые флаги FPU как denormals-are-zero.

На гипотетической реализации, называя основным мог привести к забавным вещам как повторно выполняющиеся конструкторы для всех статических переменных, повторно инициализировав структуры данных, используемые new / delete для отслеживания выделения или другую общую поломку программы. Или это не могло бы вызвать проблему вообще. Неопределенное поведение не означает, что имеет для сбоя на каждой реализации.

40
ответ дан 31 October 2019 в 13:16

Прототип требуется, если Вы хотите вызвать функцию, но это еще не доступно, как sum в Вашем случае.

Вы не должны звонить main сами, таким образом, нет никакой потребности иметь прототип. Это - даже плохое идея записать прототип.

34
ответ дан 31 October 2019 в 13:16

нет, для компилятора не нужно предописание для main().

main() специальная функция в C++.

Некоторые важные вещи помнить об основном ():

  1. компоновщик требует, чтобы один и только один main() функция существовала при создании исполняемой программы.
  2. компилятор ожидает основное () функция в одной из следующих двух форм:
int main () { /* body */ } 
int main (int argc, char *argv[]) { /* body */ } 

, где body нуль или больше операторов

, дополнительная приемлемая форма является конкретной реализацией и предоставляет список переменных среды в то время, когда функция вызвана:

int main (int argc, char* argv[], char *envp[]) { /* body */ }

кодер должен предоставить 'определение' основного использования одной из этих приемлемых форм, но кодер не должен обеспечивать объявление. Кодированное определение принято компилятором как объявление основных ().

  1. , Если никакой оператор возврата не обеспечивается, компилятор обеспечит return 0; как последний оператор в теле функции.

Как в стороне, иногда существует беспорядок о том, может ли программа C++ позвонить основному (). Это не рекомендуется. C++ 17 проектов указывают, что основной () "не буду использоваться в рамках программы". Другими словами, не может быть назван из программы. Посмотрите, например, Рабочий Черновой Стандарт для Языка Программирования на C++, датированного "2017-03-21", Абзац 6.6.1.3, страница 66 . Я понимаю, что некоторые компиляторы поддерживают это (включая мой), но следующая версия компилятора могла изменить или удалить то поведение, поскольку стандарт использует термин, "буду не".

25
ответ дан 31 October 2019 в 13:16

Это недопустимо для вызова main из программы. Это означает единственную вещь, которая собирается звонить, это - время выполнения, и компилятор/компоновщик может обработать установку этого. Это означает, что Вам не нужен прототип для main.

10
ответ дан 31 October 2019 в 13:16

Определение функции также неявно объявляет это. Если необходимо сослаться на функцию, прежде чем она будет определена, необходимо объявить это перед использованием ее.

Настолько пишущий следующее также допустимо:

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) просто представляет точку входа Вашего кода.

7
ответ дан 31 October 2019 в 13:16

Нет. Вы не можете назвать его так или иначе.

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

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

[я посмотрел на crt0.c, и он действительно имеет объявление для основного, но это ни здесь, ни там].

5
ответ дан 31 October 2019 в 13:16

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

Похожие вопросы: