Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #11371

Re: initialization of local static variable

From jt@toerring.de (Jens Thoms Toerring)
Newsgroups comp.lang.c
Subject Re: initialization of local static variable
Date 2011-10-08 00:02 +0000
Organization Freie Universitaet Berlin
Message-ID <9f9i99Ff4oU1@mid.uni-berlin.de> (permalink)
References (6 earlier) <j6nkfh$3tt$1@speranza.aioe.org> <0.c17dea24b635577dbcc6.20111007211624BST.87hb3kwo9z.fsf@bsb.me.uk> <j6nn1h$al8$1@speranza.aioe.org> <9f9civF6foU1@mid.uni-berlin.de> <j6nv5f$tpq$1@speranza.aioe.org>

Show all headers | View raw


jacob navia <jacob@spamsink.net> wrote:
> Le 08/10/11 00:25, Jens Thoms Toerring a écrit :
> >
> > I don't want to argue if this is wrong - you write the compiler
> > and thus you define what happens - but, at least to me, it does
> > not make things easier to understand or seems to be more cohe-
> > rent since I now also have to consider how a static variable is
> > initialized in order to figure out how it will behave.

> Obviously if it is initialized with a constant expression the simple
> rule applies as before: it is initialized once by the linker before
> the program is loaded

> If the expression is not constant it will be initialized when the
> program executes the initialization statement (it can't be otherwise
> since it is NOT a constant expression)

I could be completely wrong here since I don't have your compiler
installed and thus have to rely on BartC's descriptions. But if
he's correct and I understanding his descriptions correctly a static
variable with a constant expression initializer is initialized only
once, while one with a non-constant expression initializer is set
again each time the function is called. If this is true then I
would think things might become confusing: what actually is a "con-
stant expression" can be a bit difficult to see (I have to admit
that even after a number of years using C I'm still not always
100% certain and may like to rely on the compiler to point out
the errors of my way;-)

Your

> double sqrt2_over_2 = sqrt(2)/2;

is a nice example. At the first glance, this is as constant a
value as they get, no doubts about that from a mathematical point
of view. So one would rather likely expect the compiler to "under-
stand" that I mean the quite constant value of 0.70710678... But
then the compiler might not know if I'm going to do something sneaky
like linking against a different libm where the result of sqrt(2)
is something different from 1.41421345... And thus it can't be 100%
sure it's dealing with a constant and will consider it (against
all common sense) to be an initialization with a non-constant
value.

So my point is that while the above looks like a very constant
expression and thus a user may reasonably expect it to be one,
it actually isn't one. And when you make the behaviour of a
static variable depend on what it was initialized with you might
end up with some confusion for the unsuspecting users. Consider
a function like this

double bar( void ) {
    static double sqrt2_over_2 = sqrt( 2 ) / 2;
    if ( sqrt2_over_2 == sqrt( 2 ) / 2 )
        return sqrt2_over_2;
    return sqrt2_over_2 = 42.0;
}

What I'm going to get on the first and the second invocation
(please disregard problems with floating point comparisons for
equality for the sake of the example)? Is it an initialization
with a constant value or isn't it? What is an unsuspecting
user going to expect?

Of course, all this is only relevant if the description given
by BartC is correct.

> Now, I have a problem with the "once" that Ben pointed out. Should
> I generate code that initializes that ONCE?

> For instance I could generate code that tests a memory location to see
> if the variable is initialized or not and skip the initialization
> if it is initialized already.

I'm not sure what you mean with the "once" stuff - but I personally
wouldn't expect to have a static variable having set its value more
than once - ever. I.e. for

long int foo_s( ) {
    static long int r = random( );
    return r;
}

I would expect to get the same value returned each time while
with

long int foo_a( ) {
    long int r = random( );
    return r;
}

I'd expect a different value on each invocation.

                          Regards, Jens
-- 
  \   Jens Thoms Toerring  ___      jt@toerring.de
   \__________________________      http://toerring.de

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

initialization of local static variable "V.Subramanian, India" <subramanian100in@yahoo.com> - 2011-10-06 23:33 -0700
  Re: initialization of local static variable pete <pfiland@mindspring.com> - 2011-10-07 02:51 -0400
  Re: initialization of local static variable "BartC" <bc@freeuk.com> - 2011-10-07 10:44 +0100
  Re: initialization of local static variable China Blue Corn Chips <chine.bleu@yahoo.com> - 2011-10-07 03:03 -0700
    Re: initialization of local static variable "BartC" <bc@freeuk.com> - 2011-10-07 11:33 +0100
      Re: initialization of local static variable jt@toerring.de (Jens Thoms Toerring) - 2011-10-07 11:11 +0000
        Re: initialization of local static variable "BartC" <bc@freeuk.com> - 2011-10-07 12:51 +0100
          Re: initialization of local static variable jt@toerring.de (Jens Thoms Toerring) - 2011-10-07 15:56 +0000
            Re: initialization of local static variable Ben Bacarisse <ben.usenet@bsb.me.uk> - 2011-10-07 20:29 +0100
              Re: initialization of local static variable jacob navia <jacob@spamsink.net> - 2011-10-07 21:38 +0200
                Re: initialization of local static variable Ben Bacarisse <ben.usenet@bsb.me.uk> - 2011-10-07 21:16 +0100
                Re: initialization of local static variable jacob navia <jacob@spamsink.net> - 2011-10-07 22:22 +0200
                Re: initialization of local static variable jt@toerring.de (Jens Thoms Toerring) - 2011-10-07 22:25 +0000
                Re: initialization of local static variable jacob navia <jacob@spamsink.net> - 2011-10-08 00:40 +0200
                Re: initialization of local static variable Ian Collins <ian-news@hotmail.com> - 2011-10-08 11:56 +1300
                Re: initialization of local static variable jacob navia <jacob@spamsink.net> - 2011-10-08 01:53 +0200
                Re: initialization of local static variable Jens Gustedt <jens.gustedt@loria.fr> - 2011-10-09 23:04 +0200
                Re: initialization of local static variable Andrew Haley <andrew29@littlepinkcloud.invalid> - 2011-10-10 11:54 -0500
                Re: initialization of local static variable Ike Naar <ike@sverige.freeshell.org> - 2011-10-10 17:41 +0000
                Re: initialization of local static variable Andrew Haley <andrew29@littlepinkcloud.invalid> - 2011-10-10 17:35 -0500
                Re: initialization of local static variable jt@toerring.de (Jens Thoms Toerring) - 2011-10-08 00:02 +0000
                Re: initialization of local static variable "BartC" <bc@freeuk.com> - 2011-10-08 01:26 +0100
                Re: initialization of local static variable "Philip Lantz" <prl@canterey.us> - 2011-10-08 03:01 -0700
                Re: initialization of local static variable "BartC" <bc@freeuk.com> - 2011-10-07 21:42 +0100
                Re: initialization of local static variable China Blue Corn Chips <chine.bleu@yahoo.com> - 2011-10-07 16:25 -0700
                Re: initialization of local static variable jacob navia <jacob@spamsink.net> - 2011-10-08 01:51 +0200
                Re: initialization of local static variable China Blue Corn Chips <chine.bleu@yahoo.com> - 2011-10-07 18:21 -0700
                Re: initialization of local static variable Nobody <nobody@nowhere.com> - 2011-10-08 15:36 +0100
                Re: initialization of local static variable Ben Bacarisse <ben.usenet@bsb.me.uk> - 2011-10-08 22:06 +0100
                Re: initialization of local static variable Nobody <nobody@nowhere.com> - 2011-10-09 05:35 +0100
                Re: initialization of local static variable Ben Bacarisse <ben.usenet@bsb.me.uk> - 2011-10-09 09:25 +0100
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-09 11:00 +0200
                Re: initialization of local static variable Barry Schwarz <schwarzb@dqel.com> - 2011-10-09 10:56 -0700
                Re: initialization of local static variable James Kuyper <jameskuyper@verizon.net> - 2011-10-09 14:30 -0400
                Re: initialization of local static variable Barry Schwarz <schwarzb@dqel.com> - 2011-10-09 21:43 -0700
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-10 19:08 +0200
                Re: initialization of local static variable Geoff <geoff@invalid.invalid> - 2011-10-10 16:16 -0700
                Re: initialization of local static variable Ike Naar <ike@iceland.freeshell.org> - 2011-10-10 23:22 +0000
                Re: initialization of local static variable James Kuyper <jameskuyper@verizon.net> - 2011-10-10 20:40 -0400
                Re: initialization of local static variable Barry Schwarz <schwarzb@dqel.com> - 2011-10-10 20:54 -0700
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-11 18:45 +0200
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-11 18:51 +0200
                Re: initialization of local static variable Barry Schwarz <schwarzb@dqel.com> - 2011-10-11 18:52 -0700
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-12 08:49 +0200
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-11 19:48 +0200
                Re: initialization of local static variable Barry Schwarz <schwarzb@dqel.com> - 2011-10-11 21:25 -0700
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-12 08:48 +0200
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-12 08:54 +0200
                Re: initialization of local static variable pete <pfiland@mindspring.com> - 2011-10-12 20:55 -0400
                Re: initialization of local static variable Barry Schwarz <schwarzb@dqel.com> - 2011-10-11 18:52 -0700
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-11 19:55 +0200
                Re: initialization of local static variable Keith Thompson <kst-u@mib.org> - 2011-10-11 11:24 -0700
                Re: initialization of local static variable Keith Thompson <kst-u@mib.org> - 2011-10-11 12:47 -0700
                Re: initialization of local static variable "io_x" <a@b.c.invalid> - 2011-10-12 08:49 +0200
            Re: initialization of local static variable Tim Rentsch <txr@alumni.caltech.edu> - 2012-01-24 16:09 -0800
          Re: initialization of local static variable China Blue Corn Chips <chine.bleu@yahoo.com> - 2011-10-07 16:06 -0700
            Re: initialization of local static variable Seebs <usenet-nospam@seebs.net> - 2011-10-12 22:25 +0000
              Re: initialization of local static variable "christian.bau" <christian.bau@cbau.wanadoo.co.uk> - 2011-10-13 07:09 -0700
                Re: initialization of local static variable Seebs <usenet-nospam@seebs.net> - 2011-10-17 17:21 +0000
              Re: initialization of local static variable Joe Wright <joewwright@comcast.net> - 2011-10-14 14:27 -0400
          Re: initialization of local static variable Richard Damon <news.x.richarddamon@xoxy.net> - 2011-10-08 00:03 -0400
            Re: initialization of local static variable China Blue Corn Chips <chine.bleu@yahoo.com> - 2011-10-08 01:27 -0700
          Re: initialization of local static variable Richard Damon <news.x.richarddamon@xoxy.net> - 2011-10-08 00:08 -0400

csiph-web