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

Why is it not possible to use implicitly typed function arguments with explicitly typed function arguments?

提问人:iocode 提问时间:1/5/2023 最后编辑:iocode 更新时间:1/8/2023 访问量:90

问:

如果我要编译以下代码:

// x is implicitly typed as int
void foo(x, char y) {
    return;
}

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

然而:

void foo(int x, char y) {
    return;
}

编译成功。

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

c 语法错误

评论

3赞 Shawn 1/5/2023
因为它不是有效的 C 语法。
1赞 Neil 1/5/2023
具有讽刺意味的是,我认为这将是有效的 C90 语法。
3赞 Nate Eldredge 1/5/2023
如果你只是在学习 C,那么完全忘记隐式声明。它们已经完全过时了,即使仍然允许它们,它们也存在问题。考虑它们的唯一可接受的理由是,如果你是一个对极端细节感兴趣的语言律师,或者你实际上生活在 80 年代初,并且正在通过时间和空间:)的虫洞发帖
1赞 iocode 1/5/2023
@NateEldredge我只是问了这个问题,因为我偶然发现了隐式类型,我只是想“也许我可以使用它”
1赞 Nate Eldredge 1/5/2023
当然,我只是在开玩笑,这是一个非常好的问题。但是,如果你想知道是否可以或应该在自己的代码中使用隐式声明,那么所有意图和目的的答案都是否定的。

答:

5赞 dbush 1/5/2023 #1

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

int foo(x, y) 
{
    return 0;
}

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

int foo(x, y) 
   int x;
   char *y;
{
    return 0;
}

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

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

因此,没有太多理由将两者混合在一起,因为一个是为了改进另一个。

评论

1赞 iocode 1/5/2023
因此,隐式类型只是一个古老的功能,从那时起就一直保留在语言中,就像关键字一样auto
0赞 chux - Reinstate Monica 1/5/2023
@nameless_user 考虑一下 C 开发时,内存需要花费几个字节。使用了今天没有立足之地的捷径。
0赞 SafelyFast 1/5/2023
@nameless_user C 没有 auto 关键字。
0赞 dbush 1/5/2023
@SafelyFast 实际上确实如此,尽管它只能应用于局部变量,因此是多余的。
0赞 SafelyFast 1/5/2023
哇,我学到了一些新东西。谢谢。下次我会在发表这样的评论之前进行研究!