Что такое формальный параметр?
При компиляции на С++ я часто получаю сообщения об ошибках, касающиеся "формальных параметров", например
error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned
Я понимаю ошибку и тот факт, что b
является параметром функции, которую я определяю.
Однако, что это означает, что параметр является формальным? Могут ли быть и неофициальные параметры?
Я замечаю, что термин "формальный параметр" появляется и на других языках, поэтому я полагаю, что это более общий термин, не обязательно специфический для C-семейства языков? Поддерживаются ли неформальные параметры некоторым подмножеством языков?
Увидев ответы, один последний вопрос: откуда взялись эти формальные параметры и фактическое значение параметра? Происходит ли это из стандарта C, или это эффект называть его как таковой в каком-то абстрактном исчислении языка?
Ответы
Ответ 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
и аналогично для второго аргумента.
Различие между параметрами и аргументами, возможно, более важно для разработчиков языков и авторов компиляторов, но, как пример на С++, может быть очень полезно обдумать это, когда вы пытаетесь следовать правилам аргумента шаблона вычет.