Для чего в программе используется прототип функции

Зачем нужны прототипы функций? Зачем нужно обьявление переменных? Почему нельзя без прототипа сразу обьявить функцию с описанием, почему нельзя сразу инициализировать переменные?

int sum(int, int); //прототип функции с двумя параметрами void foo(); //прототип функции без параметров void foo(const char*); //прототип функции с одним параметром int main() < foo(«HELLO!»); //Использование одной функции cout // я так понимаю это ОПИСАНИЕ?? int sum(int x, int y) < cout void foo() < cout void foo(const char* S)
Можно ли обойтись без Прототипа?
Отслеживать
Maryna Said
задан 28 дек 2017 в 12:18
Maryna Said Maryna Said

543 1 1 золотой знак 7 7 серебряных знаков 14 14 бронзовых знаков

В общем случае, можно и можно. Приведите примеры, с которыми у вас возникают описываемые вами проблемы.

– user181100
28 дек 2017 в 12:23
28 дек 2017 в 12:32
А что вы понимаете под «описанием»? Тело/реализацию?

– user181100
28 дек 2017 в 12:33
28 дек 2017 в 12:34

Если вы хотите добавить пример того, о чём спрашиваете, добавляйте лучше сразу в вопрос. Его можно (и часто нужно) редактировать. Предполагайте что комментарии могут испариться в любой момент (это правда так).

Уроки по С++. Урок 13. Подпрограммы. Функции. Прототип функции.

– user181100
28 дек 2017 в 12:34

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

«Прототип стал необходим после того, как стандарты языка С изменились таким образом, что перед вызовом функции в файле необходимо каким либо образом ее описать. Проблема состоит в том, что имя функции имеет глобальную область видимости (если ее описание находится вне всяких локальных областей). Допустим, что описание функции находится в отдельном исходном файле.

Также допустим, что необходимо осуществить вызов этой же функции в нескольких других исходных файлах. Если нет прототипа, то в каждый такой исходный файл необходимо включить полное описание функции. Компилятор будет интерпретировать это как переопределение. Если же мы используем прототип, то мы можем включать этот прототип в столько исходных файлов, сколько нам необходимо.»

Читайте также:
Sippoint что это за программа

Отслеживать
ответ дан 28 дек 2017 в 12:35
Николай Хитров Николай Хитров
56 4 4 бронзовых знака

  • c++
  • функции
  • переменные
  • инициализация
    Важное на Мете

Связанные

Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник: ru.stackoverflow.com

Прототипы функций. Прототип функции что это. Прототип функции пример. C++ для начинающих. Урок #36

13.3. Прототип функции.

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

Описание функции заключается в приведении в начале программного файла ее прототипа (заголовка). Прототип функции сообщает компилятору о том, что далее в тексте программы будет приведено ее полное определение: в текущем или другом файле исходного текста, либо в библиотеке, содержащей ее скомпилированный (объектный) код.

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

Это позволяет компилятору различать их. Описание дает возможность компилятору проверить соответствие типов и количества параметров при фактическом вызове этой функции. В определении и в описании одной и той же функции типы и порядок следования параметров должны совпадать. Тип возвращаемого значения и типы параметров совместно определяют тип функции. Пример описания функции fun, которая имеет три параметра типа int, один параметр типа double и возвращает результат типа double: double fun(int, int, int, double); Пример описания для вышеприведенной функции Min: int Min (int x, int y); либо int Min (int, int);

Читайте также:
Программа оригинал для чего

13.4. Область видимости.

  1. Параметры функции являются локальными переменными, их область действия — вся функция;
  2. Если переменная объявлена внутри круглых скобок какого-либо оператора (например, for (int i=0; i ), то областью ее действия одни компиляторы считают этот оператор (вместе с его телом), а другие — весь блок, в котором он находится. Рекомендуется поэтому использовать подобное место объявления, только если это не может привести к двусмысленности.
  3. Область действия метки — вся функция (даже если метка лежит во вложенном блоке).
  4. Функции не могут быть объявлены внутри других функций; поэтому они, как правило, являются глобальными. (При необходимости их область видимости можно ограничить с помощью не рассматриваемого здесь оператора namespace).

Ограничение

Для продолжения скачивания необходимо пройти капчу:

Источник: studfile.net

Прототипы функций

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

Синтаксис

declaration :
declaration-specifiers attribute-seq opt init-declarator-list opt ;

/* attribute-seq необ. относится только к продуктам Майкрософт */

declaration-specifiers :
storage-class-specifier declaration-specifiers необ.
type-specifier declaration-specifiers необ.
type-qualifier declaration-specifiers необ.

init-declarator-list :
init-declarator
init-declarator-list , init-declarator

init-declarator :
declarator
declarator = initializer

direct-declarator : /* Оператор объявления функции */
direct-declarator ( parameter-type-list ) /* Оператор объявления нового стиля */
direct-declarator ( identifier-list opt ) /* Оператор объявления старого стиля */

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

Ниже перечислены важные случаи применения прототипов функций:

  • Они определяют тип возвращаемого значения для функции, возвращающих типы, отличные от int . Хотя для функций, возвращающих значения типа int , прототипы не обязательны, рекомендуется их использовать.
  • Без полных прототипов выполняются стандартные преобразования, но не производится попытка сравнения типа или количества аргументов с количеством параметров.
  • Прототипы используются для инициализации указателей на функции до определения этих функций.
  • Список параметров используется для проверки соответствия аргументов в вызове функции и параметров в ее определении.
Читайте также:
Программа mcafee что это

Преобразованный тип каждого параметра определяет интерпретацию аргументов, помещаемых в стек при вызове функции. Несоответствие типов аргументов и параметров может приводить к неправильной интерпретации аргументов в стеке. Например, если на 16-разрядном компьютере в качестве аргумента передается 16-разрядный указатель, объявленный как параметр long , первые 32 бита в стеке интерпретируются как параметр типа long . Эта ошибка создает проблемы не только с параметром long , но и со всеми последующими параметрами. Ошибки такого типа можно обнаруживать, объявляя полные прототипы для всех функций.

Прототип устанавливает атрибуты функции. После этого вызовы функций, предшествующие определению функции (или в других исходных файлах), можно проверять на несоответствие типов аргументов и возвращаемых типов. Например, если в прототипе указан описатель класса хранения static , необходимо также задать класс хранения static в определении функции.

Полные объявления параметров ( int a ) могут использоваться совместно с абстрактными деклараторами ( int ) в одном объявлении. Например, следующее объявление является допустимым:

int add( int a, int );

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

Без такого списка выявление несоответствий невозможно, поэтому компилятор не может создавать соответствующие диагностические сообщения. Дополнительные сведения о проверке типов содержатся в статье Аргументы.

Теперь область прототипа в компиляторе Microsoft C соответствует стандарту ANSI при компиляции с параметром /Za . Если вы объявите в прототипе тег struct или union , этот тег добавляется именно в этой области, а не в глобальной области. Например, если выполнять компиляцию с параметром /Za в соответствии со стандартом ANSI, эту функцию невозможно будет вызвать без получения ошибки несоответствия типов:

void func1( struct S * );

Чтобы исправить код, определите или объявите struct или union в глобальной области перед прототипом функции:

struct S; void func1( struct S * );

В /Ze параметре тег по-прежнему вводится в глобальной области.

Источник: learn.microsoft.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru