为什么不能将隐式类型函数参数与显式类型函数参数一起使用?

ioc*_*ode 3 c syntax-error

如果我要编译以下代码:

// x is implicitly typed as int
void foo(x, char y) {
    return;
}
Run Code Online (Sandbox Code Playgroud)

会发生语法错误 ( expected identifier),但我不确定为什么此语法无效。

然而:

void foo(int x, char y) {
    return;
}
Run Code Online (Sandbox Code Playgroud)

编译成功。

那么为什么这个语法无效呢?我不是 C 方面的专家,所以我不确定这是否是一个愚蠢的问题。

dbu*_*ush 5

隐式参数类型,或者更准确地说是带有标识符列表的函数定义,是 C 原始 K&R 设计的一部分。在那些日子里,您可以有这样的定义:

int foo(x, y) 
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有参数默认为 type int,或主体之前的一组声明:

int foo(x, y) 
   int x;
   char *y;
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

指定参数的类型。在这两种情况下,调用者都不知道参数的类型。

后来在语言中添加了直接在定义中指定类型的功能,这也增加了在声明中指定函数参数类型的功能,允许调用者知道参数的类型。

因此,没有太多理由将两者混合起来,因为其中一个是为了改进另一个而设计的。