什么是形式参数?

Cyg*_*sX1 23 c c++ language-agnostic language-design

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

error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned
Run Code Online (Sandbox Code Playgroud)

我确实理解错误,这b是我定义的函数的参数.

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

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


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

cpp*_*cpp 31

正式实际参数:

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

int main()
{
    int val = 1;
    foo(val);  //val is an actual parameter
}
Run Code Online (Sandbox Code Playgroud)

C++标准:

1.3.1形式参数(参数)

声明为函数声明或定义的一部分的对象或引用,或者在异常处理程序的catch子句中声明的对象或引用,它在函数或处理程序的入口处获取值; 逗号分隔列表中的标识符,该列表由紧跟在函数式宏定义中的宏名称后面的括号限定; 或模板参数.参数也称为形式参数或形式参数.

1.3.10实际参数(参数)

逗号分隔列表中的表达式,由函数调用表达式中的括号限定,逗号分隔列表中的预处理标记序列,由类似函数的宏调用中的括号,throw的操作数或表达式限定,逗号分隔列表中的type-id或template-name,由模板实例化中的尖括号限定.也称为实际参数或实际参数.

  • 应注意,这些术语(正式和实际参数)已被C标准弃用.正确的术语是"参数"和"参数". (9认同)

Sin*_*all 15

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

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

foo(10); // 10 is the actual parameter
Run Code Online (Sandbox Code Playgroud)

  • 我认为传递给函数的东西是“参数”,而函数拥有的东西是“参数”? (2认同)

Ker*_* SB 9

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

int foo(bool a, float b);
Run Code Online (Sandbox Code Playgroud)

这里ab是形式参数.关键在于,在函数体中,您"正式"引用这些参数而不实际知道它们的值.只有在您实际评估函数调用表达式时,才会将形式函数参数绑定到函数调用参数:

int result = foo(false, 1.5);
Run Code Online (Sandbox Code Playgroud)

在此调用表达式中,false第一个参数的值绑定到形式参数a,类似于第二个参数.

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