当我这样做时,代码工作正常:
#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);
}
为什么?
答案 0 :(得分:8)
首先引用C11
,第6.7.6.3章
参数声明中唯一的存储类说明符是
register
。
因此,这是在标准中明确指定。
也就是说,存在这种限制是因为使用像static
/ extern
这样的显式存储类,内存管理会出现问题,因为函数参数属于函数的块范围及其生命周期仅限于执行功能体。
参数变量不能超过对函数的调用;否则,在下次调用同一函数时,参数会产生什么影响?因此static
存储无意义,auto
是多余的。
由于函数参数没有链接,extern
也没有意义。
此外,正如C11
中所述,对于托管环境,main()
的符合签名至少为int main(void)
。