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

Why can't I specify the storage class for formal parameters of a function?

当我执行以下操作时,代码工作正常:

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

产生错误,

error: storage class specified for parameter 'a'

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

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

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

这是为什么?

首先,引用 C11,第 6.7.6.3 章

The only storage-class specifier that shall occur in a parameter declaration is register.

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

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

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

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


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