When I do as below the code works fine :
#include <stdio.h>
void test( int a)
{
printf("a=%d\n",a);
}
int main()
{
test(10);
return 1;
}
But when I do
#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;
}
It generates an error,
error: storage class specified for parameter 'a'
Why is that error? What happens internally(memory management)?
But it works fine without any error when I do:
void test( register int a)
{
printf("a=%d\n",a);
}
Why is that?
First,quoting
C11
, chapter 6.7.6.3So, this is explicitly specified in the standard.
That said, this restriction exists because with an explicit storage class like
static
/extern
, there will be problems in memory management, as function parameters are in the block scope for the function and their lifetimes are limited to the execution of the function body.A parameter variable cannot outlive the call to the function; otherwise, what would be the effect of the argument in the next call to the same function? So
static
storage is not meaningful, andauto
is redundant.Since the function parameters has no linkage,
extern
also makes no sense.Additionally, as mentioned in
C11
, for a hosted environment, the conforming signature formain()
isint main(void)
, at least.