为什么我不能为函数的形式参数指定存储类?

时间:2017-06-08 14:53:07

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

当我这样做时,代码工作正常:

#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;
}

它会产生错误,

  

错误:为参数&#39; a&#39;

指定的存储类

为什么会出错?内部会发生什么(内存管理)?

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

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

为什么?

1 个答案:

答案 0 :(得分:8)

首先引用C11,第6.7.6.3章

  

参数声明中唯一的存储类说明符是register

因此,这是在标准中明确指定

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

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

  • 由于函数参数没有链接,extern也没有意义。

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