当我这样做时,代码工作正常:
#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);
}
这是为什么?
首先,引用C11
,第6.7.6.3章
唯一存在于参数声明中的存储类说明符是
register
。
因此,这在标准中明确指定。
也就是说,存在这种限制是因为使用像static
/ extern
这样的显式存储类,存储器管理会出现问题,因为函数参数位于函数的块范围内,并且它们的生命周期仅限于函数体的执行。
static
存储没有意义,auto
是多余的。extern
也没有意义。另外,如C11
所述,对于托管环境,main()
的符合签名至少是int main(void)
。