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


Groups > comp.lang.c > #3977

Re: Non-constant initializers

From Shao Miller <sha0.miller@gmail.com>
Newsgroups comp.lang.c
Subject Re: Non-constant initializers
Date 2011-05-14 16:14 -0500
Organization A noiseless patient Spider
Message-ID <iqmnr0$6an$1@dont-email.me> (permalink)
References (6 earlier) <e68b19561ee2543-31bc7@gmail.com> <iqhrt1$v8n$1@dont-email.me> <9322eedb3a632f5-29a98@gmail.com> <iqmhp7$l57$1@dont-email.me> <70b21f510c7390e-cc0de@gmail.com>

Show all headers | View raw


On 5/14/2011 2:25 PM, Uncle Steve wrote:
> On Sat, May 14, 2011 at 02:30:58PM -0500, Shao Miller wrote:
>> On 5/14/2011 12:59 PM, Uncle Steve wrote:
>>> On Thu, May 12, 2011 at 06:53:02PM -0500, Shao Miller wrote:
>>>> Some more questions:
>>>>
>>>> - When do you wish this initialization to occur?  Prior to main()?
>>>
>>> In a perfect world.
>>>
>>
>> Ok.  So now: Why?  (Please see next response.)
>
>>>> - Could you employ and enjoy an init() function which would initialize
>>>> these objects, then make that the first call inside main()?
>>>>
>>
>> No answer to this one?  If the very first thing main() does is to call
>> an init() which populates your globals' values, then that init() makes
>> for a nicely-readable section of code to gather these items into one place.
>
> You're making this too easy.  What could be cleaner than a variable
> declaration outside of main() which also initializes it to the value it
> should have before main() is called?

Ok, so my impression now is that by "cleaner," you mean that such 
reduces keyboard typing redundancy by having the value population appear 
alongside the declaration, thus avoiding typing the identifier's name 
again within an init() function.

> I'm fully aware that I can
> assign a value to a variable any time I write code or macros to do it,
> but there are certain kinds of application parameters, for instance,
> which you may derive empirically, and assign once.  I should think
> that most programmers know about these types of variables.

Ah, now this gives me the impression that not only are you interested in 
restoring saved settings, but that you'd _also_ like to be able to 
compute things using C functions, and have those computation results 
available at compile-time.  Perhaps something like declaring an array 
with a number of elements which is 'pow(5, 6)'.  Do I understand your 
wish correctly?

>
>>>> - In your code example, is howmuchfoo() supposed to be returning an
>>>> array of 'int' or a single 'int'?
>>>
>>> I don't see how that's relevant to the question.
>>>
>>
>> Well it's an opportunity to suggest that C functions do not return
>> arrays, as far as I know.  If howmuchfoo() was a macro that expanded to
>> an initializer list, then I believe that'd be fine.
>
> It could do just about anything if it was a C function, couldn't it?
>

Perhaps not in a standard, portable sense.  As an example, we have 
n1256.pdf, section 6.5.2.2, point 1:

   "The expression that denotes the called function...shall have type 
pointer to function returning void or returning an object type other 
than an array type."

>>>> - Is your request a matter of being able to read, in your code, what
>>>> will be computed for an object in the immediate vicinity of the object,
>>>> rather than in another place (such as an init() function)?
>>>
>>> That all depends on what kind of data the variables are going to hold.
>>> One time, I might want to save/restore window size and positioning,
>>> and in another place, the volume setting of application sounds.  It is
>>> impossible to say, a priori, what variables will be used/set where, at
>>> least at this stage of the design process.
>>>
>>
>> My question there wasn't too clear and I apologize.  What I am trying to
>> understand is why you might be inclined to avoid something like the
>> init() suggestion.  Is it a matter of:
>>
>>    int saved_setting = get_saved_setting();
>>
>> looking nicer, to you, at file scope, than:
>>
>>    int saved_setting;
>>    /* ... */
>>    void init(void) {
>>        saved_setting = get_saved_setting();
>>        /* ...Other globals populated... */
>>        return;
>>      }
>>    /* ... */
>>    int main(void) {
>>        /* Populate globals */
>>        init();
>>        /* ... */
>>      }
>>
>> ?
>
> This is fine, and I've in fact done just that in code I've written
> previously.  But see above.
>

It's also nicely symmetrical if you have a save_settings().  The 
suggested init() might as well be called restore_settings() or 
load_settings().

But your "see above" suggests (to me) that you are interested in 
computations which are needed in order to affect _compile-time_ 
decisions, rather than _run-time_ decisions.

>>>> - Would you be willing to use macros to accomplish this?
>>>
>>> I'll think about it.
>>>
>>
>> Ok.  Good fortune to you. :)
>
> I'm big on macros, but sometimes they clutter up the code with
> redundant code blocks that are deader than a doornail.  Maybe the
> compiler will weed them out with global CSE, maybe not.  If they
> aren't in the code to begin with, they can't possibly get into the
> instruction cache.

One possible way to achieve _something_like_ the _look_ of the 
declarations calling functions might be the following example "uncle.c":

   #ifndef GLOBAL_INITS
   #  define TYPE(x) x
   #  define INIT(x) {0}
   #else
   #  undef TYPE
   #  define TYPE(x)
   #  undef INIT
   #  define INIT(x) x
   #endif /* GLOBAL_INITS */

   #ifndef GLOBAL_INITS
   #include <stdio.h>

   #endif /* GLOBAL_INITS */
   /*** Globals */
   TYPE(int) saved_setting = INIT(get_saved_setting());
   TYPE(int) saved_setting2 = INIT(get_saved_setting2());

   #ifndef GLOBAL_INITS
   int get_saved_setting(void) {
       /* TODO: Actually fetch the saved setting */
       return 3;
     }

   int get_saved_setting2(void) {
       /* TODO: Actually fetch the saved setting */
       return 5;
     }

   void init(void) {
       #define GLOBAL_INITS 1
       #include "uncle.c"
       #undef GLOBAL_INITS
       return;
     }

   int main(void) {
       init();
       printf("saved_setting: %d\n", saved_setting);
       printf("saved_setting2: %d\n", saved_setting2);
       return 0;
     }

   #endif /* GLOBAL_INITS */

That's still kind of ugly. :)

However this would not help with a wish to call C functions in order to 
compute something which needs to influence compile-time decisions, such 
as the size of an array declared at file-scope.  I think that folks 
usually have a separate C program perform such computations, then output 
C source, which is then compiled with the rest of your code; code 
generation.

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


Thread

Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-12 22:59 +0000
  Re: Non-constant initializers Ian Collins <ian-news@hotmail.com> - 2011-05-13 11:07 +1200
    Re: Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-12 23:17 +0000
      Re: Non-constant initializers Ian Collins <ian-news@hotmail.com> - 2011-05-13 11:20 +1200
        Re: Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-12 23:30 +0000
          Re: Non-constant initializers Ian Collins <ian-news@hotmail.com> - 2011-05-13 11:34 +1200
            Re: Non-constant initializers Keith Thompson <kst-u@mib.org> - 2011-05-12 16:52 -0700
              Re: Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-14 00:13 +0000
                Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-14 01:28 +0000
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 13:52 -0400
                Re: Non-constant initializers kym@kymhorsell.com - 2011-05-14 01:54 +0000
                Re: Non-constant initializers Columbus sailed the ocean China Blue <chine.bleu@yahoo.com> - 2011-05-14 01:07 -0700
                Re: Non-constant initializers kym@kymhorsell.com - 2011-05-14 09:22 +0000
                Re: Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-14 17:14 +0000
            Re: Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-14 00:11 +0000
  Re: Non-constant initializers Shao Miller <sha0.miller@gmail.com> - 2011-05-12 18:08 -0500
    Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-12 19:22 -0400
      Re: Non-constant initializers Shao Miller <sha0.miller@gmail.com> - 2011-05-12 18:53 -0500
        Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 13:59 -0400
          Re: Non-constant initializers Eric Sosman <esosman@ieee-dot-org.invalid> - 2011-05-14 14:19 -0400
            Re: Non-constant initializers Shao Miller <sha0.miller@gmail.com> - 2011-05-14 15:04 -0500
            Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 15:10 -0400
              Re: Non-constant initializers James Kuyper <jameskuyper@verizon.net> - 2011-05-14 16:01 -0400
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 16:57 -0400
          Re: Non-constant initializers Shao Miller <sha0.miller@gmail.com> - 2011-05-14 14:30 -0500
            Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 15:25 -0400
              Re: Non-constant initializers Keith Thompson <kst-u@mib.org> - 2011-05-14 13:05 -0700
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 17:00 -0400
              Re: Non-constant initializers Shao Miller <sha0.miller@gmail.com> - 2011-05-14 16:14 -0500
                Re: Non-constant initializers Shao Miller <sha0.miller@gmail.com> - 2011-05-14 16:49 -0500
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 18:21 -0400
                Re: Non-constant initializers Shao Miller <sha0.miller@gmail.com> - 2011-05-14 21:26 -0500
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-15 14:01 -0400
              Re: Non-constant initializers Eric Sosman <esosman@ieee-dot-org.invalid> - 2011-05-14 17:45 -0400
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-14 18:09 -0400
                Re: Non-constant initializers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2011-05-15 04:01 +0100
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-15 13:26 -0400
                Re: Non-constant initializers Ben Bacarisse <ben.usenet@bsb.me.uk> - 2011-05-16 02:32 +0100
              Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-15 03:59 +0000
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-16 04:49 -0400
                Re: Non-constant initializers pete <pfiland@mindspring.com> - 2011-05-16 07:27 -0400
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-16 09:24 -0400
                Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-16 19:10 +0000
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-16 21:23 -0400
                Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-16 19:10 +0000
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-16 21:16 -0400
                Re: Non-constant initializers James Kuyper <jameskuyper@verizon.net> - 2011-05-16 21:37 -0400
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-16 22:42 -0400
                Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-17 02:40 +0000
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-16 22:50 -0400
                Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-17 04:14 +0000
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-17 17:37 -0400
                Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-17 22:22 +0000
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-17 18:33 -0400
                Re: Non-constant initializers Malcolm McLean <malcolm.mclean5@btinternet.com> - 2011-05-18 01:58 -0700
                Re: Non-constant initializers Uncle Steve <stevet810@gmail.com> - 2011-05-18 12:45 -0400
                Re: Non-constant initializers "io_x" <a@b.c.invalid> - 2011-05-18 19:30 +0200
                Re: Non-constant initializers Dr Nick <3-nospam@temporary-address.org.uk> - 2011-05-18 20:01 +0100
                Re: bug-free C code (was: Non-constant initializers) Seebs <usenet-nospam@seebs.net> - 2011-05-19 02:21 +0000
                Re: bug-free C code (was: Non-constant initializers) Keith Thompson <kst-u@mib.org> - 2011-05-18 20:00 -0700
                Re: bug-free C code (was: Non-constant initializers) Seebs <usenet-nospam@seebs.net> - 2011-05-19 03:14 +0000
                Re: bug-free C code (was: Non-constant initializers) Keith Thompson <kst-u@mib.org> - 2011-05-19 07:49 -0700
                Re: bug-free C code (was: Non-constant initializers) Seebs <usenet-nospam@seebs.net> - 2011-05-19 15:16 +0000
                Re: bug-free C code Ben Pfaff <blp@cs.stanford.edu> - 2011-05-18 20:02 -0700
                Re: bug-free C code Keith Thompson <kst-u@mib.org> - 2011-05-18 20:09 -0700
                Re: bug-free C code Eric Sosman <esosman@ieee-dot-org.invalid> - 2011-05-18 23:24 -0400
                Re: bug-free C code Angel <angel+news@spamcop.net> - 2011-05-19 06:39 +0000
                Re: bug-free C code Keith Thompson <kst-u@mib.org> - 2011-05-19 08:05 -0700
                Re: bug-free C code Angel <angel+news@spamcop.net> - 2011-05-19 16:22 +0000
                Re: bug-free C code Keith Thompson <kst-u@mib.org> - 2011-05-19 11:36 -0700
                Re: bug-free C code Ben Pfaff <blp@cs.stanford.edu> - 2011-05-19 12:21 -0700
                Re: bug-free C code Keith Thompson <kst-u@mib.org> - 2011-05-19 13:12 -0700
                Re: bug-free C code gazelle@shell.xmission.com (Kenny McCormack) - 2011-05-19 21:52 +0000
                Re: bug-free C code Angel <angel+news@spamcop.net> - 2011-05-19 22:16 +0000
                Re: bug-free C code Shao Miller <sha0.miller@gmail.com> - 2011-05-19 17:25 -0500
                Re: bug-free C code Kenneth Brody <kenbrody@spamcop.net> - 2011-05-20 13:32 -0400
                Re: bug-free C code gazelle@shell.xmission.com (Kenny McCormack) - 2011-05-19 21:51 +0000
                Re: bug-free C code Kenneth Brody <kenbrody@spamcop.net> - 2011-05-20 13:30 -0400
                Re: bug-free C code "Joel C. Salomon" <joelcsalomon@gmail.com> - 2011-05-18 23:13 -0400
                Re: bug-free C code Dr Nick <3-nospam@temporary-address.org.uk> - 2011-05-19 08:23 +0100
      Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-13 00:15 +0000
      Re: Non-constant initializers "io_x" <a@b.c.invalid> - 2011-05-13 11:01 +0200
    Re: Non-constant initializers Columbus sailed the ocean China Blue <chine.bleu@yahoo.com> - 2011-05-12 16:30 -0700
  Re: Non-constant initializers Columbus sailed the ocean China Blue <chine.bleu@yahoo.com> - 2011-05-12 16:15 -0700
    Re: Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-12 23:28 +0000
  Re: Non-constant initializers Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2011-05-12 18:01 -0600
    Re: Non-constant initializers Keith Thompson <kst-u@mib.org> - 2011-05-12 18:15 -0700
      Re: Non-constant initializers Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2011-05-12 22:56 -0600
        Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-13 05:18 +0000
          Re: Non-constant initializers Joe Pfeiffer <pfeiffer@cs.nmsu.edu> - 2011-05-13 09:10 -0600
            Re: Non-constant initializers Seebs <usenet-nospam@seebs.net> - 2011-05-13 20:56 +0000
      Re: Non-constant initializers Tim Rentsch <txr@alumni.caltech.edu> - 2011-05-18 23:47 -0700
        Re: Non-constant initializers Keith Thompson <kst-u@mib.org> - 2011-05-19 08:15 -0700
    Re: Non-constant initializers Fred the Freshwater Catfish <usenet.fred@bdtd.invalid> - 2011-05-13 23:57 +0000

csiph-web