如果我要编译以下代码:
// 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 方面的专家,所以我不确定这是否是一个愚蠢的问题。
隐式参数类型,或者更准确地说是带有标识符列表的函数定义,是 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)
指定参数的类型。在这两种情况下,调用者都不知道参数的类型。
后来在语言中添加了直接在定义中指定类型的功能,这也增加了在声明中指定函数参数类型的功能,允许调用者知道参数的类型。
因此,没有太多理由将两者混合起来,因为其中一个是为了改进另一个而设计的。