24

在 C++ 中编译时,我经常会收到处理“形式参数”的错误消息,例如

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

b我确实理解错误,以及我正在定义的函数的参数这一事实。

但是,参数是正式的是什么意思?也可以有非正式参数吗?

我确实注意到术语“形式参数”也出现在其他语言中,所以我认为它是一个更通用的术语,不一定特定于 C 系列语言?某些语言子集是否支持非正式参数?


看到答案后,最后一个问题:这些名称形式参数实际参数来自哪里?它起源于 C 标准,还是在某些抽象语言演算中这样称呼它的效果?

4

3 回答 3

35

有形参:

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 形参(parameter)

作为函数声明或定义的一部分或在异常处理程序的 catch 子句中声明的对象或引用,它在进入函数或处理程序时获取值;逗号分隔列表中的标识符,由括号包围,紧跟在类似函数的宏定义中的宏名称之后;或模板参数。形参也称为形参或形参。

1.3.10 实际参数(argument)

函数调用表达式中由括号包围的逗号分隔列表中的表达式,类函数宏调用中由括号包围的逗号分隔列表中的一系列预处理标记, throw 的操作数或表达式,模板实例化中由尖括号包围的逗号分隔列表中的类型 ID 或模板名称。也称为实参或实参。

于 2013-09-18T10:50:32.780 回答
16

形式参数是函数定义中已知的参数。实际参数是您在调用它时实际(因此得名)传递给函数的参数。

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

foo(10); // 10 is the actual parameter
于 2013-09-18T10:49:40.207 回答
9

这是一个对术语有点迂腐的问题,但非常有用:形式参数就是您对函数参数的看法:

int foo(bool a, float b);

这里ab是形式参数。关键是在函数体中,您“正式”地引用了这些参数,而实际上并不知道它们的值。只有当您实际评估函数调用表达式时,正式函数参数才会绑定到函数调用参数:

int result = foo(false, 1.5);

在这个调用表达式中,false第一个参数的值绑定到形参a,第二个参数也是如此。

参数和实参之间的区别对于语言设计者和编译器编写者来说可能更为重要,但作为 C++ 中的示例,当您尝试遵循模板实参推导规则时,了解这一点会非常有帮助。

于 2013-09-18T10:50:49.260 回答