Was:Re: possible bug? Workaround ??? Please
Scott Bambrough
scottb@netwinder.org
Tue Nov 30 23:39:00 GMT 1999
cej@CEJCHAN.gli.cas.cz wrote:
>
> >> > FILE *ErrorFile = stdout; <-- error line in the source
> >> > initializer element is not constant <-- error message
> >>
> Please, can you give me a hint how to modify the code to workaround this?
> Many thanks in advance,
> yours sincerely,
> Peter.
>From the GLIBC FAQ:
3.9. I get compiler messages "Initializer element not constant" with
stdin/stdout/stderr. Why?
{RM,AJ} Constructs like:
static FILE *InPtr = stdin;
lead to this message. This is correct behaviour with glibc since stdin
is
not a constant expression. Please note that a strict reading of ISO C
does
not allow above constructs.
One of the advantages of this is that you can assign to stdin, stdout,
and
stderr just like any other global variable (e.g. `stdout = my_stream;'),
which can be very useful with custom streams that you can write with
libio
(but beware this is not necessarily portable). The reason to implement
it
this way were versioning problems with the size of the FILE structure.
To fix those programs you've got to initialize the variable at run time.
This can be done, e.g. in main, like:
static FILE *InPtr;
int main(void)
{
InPtr = stdin;
}
or by constructors (beware this is gcc specific):
static FILE *InPtr;
static void inPtr_construct (void) __attribute__((constructor));
static void inPtr_construct (void) { InPtr = stdin; }
--
Scott Bambrough - Software Engineer
REBEL.COM http://www.rebel.com
NetWinder http://www.netwinder.org
More information about the Gcc-bugs
mailing list