在C ++中编译时,我经常会遇到处理“形式参数”的错误消息,例如
error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned
我确实理解错误,以及b
是我定义的函数的参数这一事实。
但是,参数正式是什么意思?是否还有非正式参数?
我注意到“形式参数”一词也出现在其他语言中,所以我认为它是一个更通用的术语,不一定特定于C族语言?某些语言子集是否支持非正式参数?
看到答案后,最后一个问题:那些名称形式参数和实际参数来自哪里?它是源于C标准,还是在某些抽象语言演算中调用它的效果?
答案 0 :(得分:30)
有正式和实际参数:
void foo(int arg); //arg is a formal parameter
int main()
{
int val = 1;
foo(val); //val is an actual parameter
}
来自C++ Standard:
1.3.1形式参数(参数)
声明为函数声明或的一部分的对象或引用 定义,或者在异常处理程序的catch子句中 获取进入函数或处理程序的值;标识符 从逗号分隔的列表中立即用括号括起来 在类似函数的宏定义中跟随宏名称;或者a 模板参数。参数也称为形式参数或 形式参数。
1.3.10实际参数(参数)
以括号括起来的逗号分隔列表中的表达式 在函数调用表达式中,一系列预处理标记 以逗号分隔的列表,由类似函数的括号括起来 宏调用,throw的操作数或表达式,type-id或 以角度为界的逗号分隔列表中的模板名称 模板实例化中的括号。也称为实际参数 或实际参数。
答案 1 :(得分:15)
形式参数是函数定义中已知的参数。当你调用它时,实际的参数就是实际(因此名称)传递给函数。
void foo( int a ); // a is a formal parameter
foo(10); // 10 is the actual parameter
答案 2 :(得分:9)
这是一个对术语有点迂腐的问题,但非常有用:形式参数就是你想到的函数参数:
int foo(bool a, float b);
此处a
和b
是形式参数。关键在于,在函数体中,您“正式”引用这些参数而不实际知道它们的值。只有当你实际评估一个函数调用表达式时,形式函数参数才会绑定到函数调用参数:
int result = foo(false, 1.5);
在此调用表达式中,第一个参数的值false
绑定到形式参数a
,类似于第二个参数。
参数和参数之间的区别对于语言设计者和编译器编写者来说可能更为重要,但作为C ++中的一个例子,当您尝试遵循模板参数的规则时,了解这一点非常有帮助。扣。