При компиляции в C ++ я часто получаю сообщения об ошибках, связанных с «формальными параметрами», такими как
error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned
Я понимаю ошибку и тот факт, что b
это параметр функции, которую я определяю.
Тем не менее, что это значит, что параметр формальный? Может ли быть неофициальный параметры как?
Я заметил, что термин «формальный параметр» встречается и в других языках, поэтому я предполагаю, что это более общий термин, не обязательно специфичный для языков C-семейства? Поддерживаются ли неформальные параметры некоторым подмножеством языков?
Увидев ответы, последний вопрос: где эти имена формальный параметр а также фактический параметр происхождение из? Происходит ли оно из стандарта C, или это эффект от того, чтобы называть его таковым в некотором абстрактном исчислении языка?
Есть формальный а также фактический параметры:
void foo(int arg); //arg is a formal parameter
int main()
{
int val = 1;
foo(val); //val is an actual parameter
}
От Стандарт C ++:
1.3.1 формальный параметр (параметр)
объект или ссылка, объявленная как часть объявления функции или
определение или в предложении catch обработчика исключений, что
получает значение при входе в функцию или обработчик; идентификатор
из списка через запятую, ограниченного скобками сразу
следование имени макроса в функционально-подобном определении макроса; или
Шаблон-параметры. Параметры также известны как формальные аргументы или
формальные параметры.
1.3.10 фактический параметр (аргумент)
выражение в списке через запятую, ограниченное скобками
в выражении вызова функции, последовательность токенов предварительной обработки в
список через запятую, ограниченный круглыми скобками в функции
вызов макроса, операнд throw или выражение, идентификатор типа или
имя шаблона в списке через запятую, ограниченном углом
скобки в шаблонном экземпляре. Также известен как фактический аргумент
или фактический параметр.
Формальные параметры — это параметры, известные при определении функции. Фактические параметры — это то, что вы на самом деле (отсюда и название) переходите к функции при ее вызове.
void foo( int a ); // a is a formal parameter
foo(10); // 10 is the actual parameter
Нужно быть немного педантичным по терминологии, но весьма полезным: формальные параметры — это то, что вы просто думаете о параметрах функции:
int foo(bool a, float b);
Вот a
а также b
являются формальными параметрами. Дело в том, что в теле функции вы ссылаетесь на эти параметры «формально», фактически не зная их значения. Это только когда ты актуален оценивать выражение вызова функции что формальные параметры функции связанный к аргументам вызова функции:
int result = foo(false, 1.5);
В этом выражении вызова значение false
первого аргумента связан с формальным параметром a
и аналогично для второго аргумента.
Различие между параметрами и аргументами, возможно, более важно для разработчиков языков и составителей компиляторов, но в качестве примера на C ++ может быть очень полезно разобраться с этим, когда вы пытаетесь следовать правилам вывода аргументов шаблона.