Подтвердить что ты не робот

Что такое формальный параметр?

При компиляции на С++ я часто получаю сообщения об ошибках, касающиеся "формальных параметров", например

error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned

Я понимаю ошибку и тот факт, что b является параметром функции, которую я определяю.

Однако, что это означает, что параметр является формальным? Могут ли быть и неофициальные параметры?

Я замечаю, что термин "формальный параметр" появляется и на других языках, поэтому я полагаю, что это более общий термин, не обязательно специфический для C-семейства языков? Поддерживаются ли неформальные параметры некоторым подмножеством языков?


Увидев ответы, один последний вопрос: откуда взялись эти формальные параметры и фактическое значение параметра? Происходит ли это из стандарта C, или это эффект называть его как таковой в каком-то абстрактном исчислении языка?

4b9b3361

Ответ 1

Существуют формальные и фактические параметры:

void foo(int arg); //arg is a formal parameter

int main()
{
    int val = 1;
    foo(val);  //val is an actual parameter
}

Из Стандарт С++:

1.3.1 формальный параметр (параметр)

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

1.3.10 фактический параметр (аргумент)

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

Ответ 2

Формальные параметры - это параметры, известные в определении функции. Фактические параметры - это то, что вы на самом деле (отсюда и имя) переходят к функции, когда вы ее вызываете.

void foo( int a ); // a is a formal parameter

foo(10); // 10 is the actual parameter

Ответ 3

Это вопрос небольшой педантичности над терминологией, но весьма полезный: формальные параметры - это то, что вы просто думаете о параметрах функции:

int foo(bool a, float b);

Здесь a и b - формальные параметры. Дело в том, что в теле функции вы ссылаетесь на эти параметры "формально", не зная их значения. Только когда вы фактически оцениваете выражение вызова функции, формальные функциональные параметры привязаны к аргументам вызова функции:

int result = foo(false, 1.5);

В этом выражении вызова значение false первого аргумента привязано к формальному параметру a и аналогично для второго аргумента.

Различие между параметрами и аргументами, возможно, более важно для разработчиков языков и авторов компиляторов, но, как пример на С++, может быть очень полезно обдумать это, когда вы пытаетесь следовать правилам аргумента шаблона вычет.