I had this code:
int foo(void){
return 1;
}
int main(void){
static const int x = foo();
//do stuff
return 0;
}
But I got an error about initializing a static variable with a non-const value. I thought it had something to do with the const specifier, but it didn’t. I ended dropping the const keyword and doing this:
int foo(void){
return 1;
}
int main(void){
static int x = 0;
if (x == 0) x = foo();
//do stuff
return 0;
}
Now, why can’t the compiler just delay the initialization of the static int x variable until it’s used, and more importantly, why can’t it just put it in a read-write section, and just enforce that it’s not written to in compile time? I’d like to use the const AND static keyword for improved semantics in my code, but I don’t really care how the compiler handles this, just let it work.
Is my understanding of the C standard wrong? Or is my compiler sucking? It’s MSVC 9.0.
C requires it.
From the C Standard:
Note that the
constqualifier does not mean constant but rather read-only. Aconstobject is not a constant in C.The reason a static object cannot be initialized by a non constant value is related to the fact that the initialization of a static object is done “prior to program startup” (C99, 6.2.4p3).