【问题标题】:Why can't I specify the storage class for formal parameters of a function?为什么不能为函数的形参指定存储类?
【发布时间】:2017-11-10 08:48:00
【问题描述】:

当我按照以下方式进行操作时,代码可以正常工作:

#include <stdio.h>
void test( int a)
{
 printf("a=%d\n",a);   
}

int main()
{
    test(10);
    return 1;
}

但是当我这样做时

#include <stdio.h>
void test( auto int a) // Or static int a Or extern int a
{
 printf("a=%d\n",a);   
}

int main()
{
    test(10);
    return 1;
}

它会产生错误,

错误:为参数“a”指定了存储类

为什么会出现这个错误?内部发生了什么(内存管理)?

但是当我这样做时它可以正常工作,没有任何错误:

void test( register int a)
{
 printf("a=%d\n",a);   
}

这是为什么呢?

【问题讨论】:

  • 参数怎么可能是static?无论如何,它会随着每次调用函数而改变......而且绝对不能是extern

标签: c function formal-languages storage-class-specifier


【解决方案1】:

首先,引用C11,第 6.7.6.3 章

应出现在参数声明中的唯一存储类说明符是register

所以,这是在标准中明确指定的。

也就是说,存在这个限制是因为使用像static/extern 这样的显式存储类,内存管理会出现问题,因为函数参数在函数的块范围内,并且它们的生命周期仅限于函数体的执行。

  • 参数变量的寿命不能超过对函数的调用;否则,在下一次调用同一函数时,参数会产生什么影响?所以static存储没有意义,auto是多余的。

  • 由于函数参数没有联动,extern也没有意义。


此外,如 C11 中所述,对于托管环境,main() 的符合签名至少是 int main(void)

【讨论】:

  • 好的,我利用了你的邀请。希望你没事。
  • @rici 非常好,先生,一如既往地感谢您的贡献。 :)
  • 非常好的答案,解释了理由。:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2022-12-24
  • 2014-11-26
相关资源
最近更新 更多