This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: gcc + cygwin

----Original Message----
>From: Marcel
>Sent: 12 May 2005 11:00

> I am NOT an experienced C or cygwin user, but the
> problems I keep running into, appear to me that gcc
> with cygwin behaves very differently from whatever I
> had on the previous systems.

  Actually, it's not a difference in gcc, but in the libc implementation.
Linux systems use glibc; cygwin is newlib-based.  There are some differences
between those two in the areas that are allowed to be
implementation-defined, and I'm afraid you've just run into one of those:

> gcc -g -Wall -c flm.c
> flm.c:37: error: initializer element is not constant
> make: *** [flm.o] Error 1
> The offending line.37 was:
> FILE *ch_par=stdout,*ch_verify=NULL;
  That's because under newlib, 'stdout' is not the name of a variable.  It's
a macro:

#define	stdin	(_REENT->_stdin)
#define	stdout	(_REENT->_stdout)
#define	stderr	(_REENT->_stderr)

that hides fetching the stdout pointer from thread-local storage, which in
turn involves calling a function:

# define _REENT (__getreent())

  So effectively you've written

FILE *ch_par = some_function ();

which, while it's a permitted way to initialise a local variable when a
function enters, cannot be used in C to initialise a static (file-scope)
variable.  In fact, if you compile your code with --save-temps and look at
the pre-processed .i file, you'll see that it's been turned into:

FILE *ch_par = ((__getreent())->_stdout);

  On some systems, stdout is just a pointer variable, but under cygwin, it
isn't.  Possible solutions include either initialising it at runtime, or
switching your compilation to C++, which does permit constructor functions.

Can't think of a witty .sigline today....

Unsubscribe info:
Problem reports:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]