gpt4 book ai didi

c - C中的标识符列表与参数类型列表

转载 作者:太空狗 更新时间:2023-10-29 17:16:47 25 4
gpt4 key购买 nike

6.7.6.3 Function declarators (including prototypes)

标准的这一部分涉及'Identifier list''Parameter type list'

首先,函数声明(不是定义)与函数原型(prototype)相同。我对么?如果这是正确的,那么为什么标准说 'including prototypes'

我无法理解“标识符列表”“参数类型列表”在函数声明方面的区别。

int fun();    // Declaration
int fun(int x)// Definition, but the signature doesn't match and it works.
{ return x; }

谁能解释一下,我很困惑?

最佳答案

函数声明与函数原型(prototype)不同。原型(prototype)是一种特殊的声明。例如,这是一个不是原型(prototype)的函数声明

int foo();

下面的声明都是原型(prototype)

int foo(int a, double b);
int bar(char, float);
float baz(void);

即原型(prototype)是描述函数参数数量和类型的声明。非原型(prototype)声明不会说明任何有关参数的信息。

现在,除了“现代”函数定义外,C 语言还支持旧的 K&R 风格的函数定义。 K&R 风格的函数定义如下所示

int foo(a, b)
int a;
double b;
{
...
}

“现代”函数定义如下所示

int foo(int a, double b)
{
...
}

如您所见,K&R 风格的参数列表只是a, b。它包括参数名称,但不包括它们的类型。这就是语法中称为 identifier-list 的内容。 “现代”参数列表是 int a, double b,这就是语法中称为 parameter-type-list 的内容。

identifier-list 是 K&R 风格函数定义语法的一部分,而 parameter-type-list 是“现代”函数定义语法的一部分。

还要注意在C语言中的声明

int foo();

并不意味着 foo 没有参数。这意味着 foo 接受未指定数量的参数,即它只是关闭参数类型检查、参数数量检查和参数转换的 foo 在通话点。这样的“签名”会将 foo 的定义与任何参数列表相匹配。这个

int foo(int x)
{
...
}

是如上所示声明的 foo 的完全有效定义。它是用 () 声明的,这意味着编译器不会在调用时验证参数。您有责任确保调用 foo 时只使用一个 int 类型的参数。

关于c - C中的标识符列表与参数类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18820751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com