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

问题描述 投票:7回答:1

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

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

这是为什么?

c function formal-languages storage-class-specifier
1个回答
8
投票

首先,引用C11,第6.7.6.3章

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.