Array initialization when defining the array

Discussion in 'C Programming' started by Spiro Trikaliotis, Jun 8, 2007.

  1. Hello,

    in a project, I stumbled upon code like follows (incomplete):

    #if defined(MINIXVMD) || defined(MINIX_SUPPORT) || defined(__VBCC__) || (defined(__BEOS__) && defined(WORDS_BIGENDIAN)) || define
    d(WATCOM_COMPILE)
    void *array[3];

    array[0]=&asm6502;
    array[1]=&asmz80;
    array[2]=NULL;
    #else
    void *array[3] = { &asm6502, &asmz80, NULL };
    #endif

    I was very surprised to read this. I always thought the array
    initialization (the #else case) was standard since C90. Am I wrong here,
    or are the compilers used non-conformant?

    Regards,
    Spiro.

    --
    Spiro R. Trikaliotis http://opencbm.sf.net/
    http://www.trikaliotis.net/ http://www.viceteam.org/
    Spiro Trikaliotis, Jun 8, 2007
    #1
    1. Advertising

  2. Spiro Trikaliotis

    Alan Curry Guest

    In article <>,
    Spiro Trikaliotis <> wrote:
    ....
    >#else
    > void *array[3] = { &asm6502, &asmz80, NULL };
    >#endif
    >
    >I was very surprised to read this. I always thought the array
    >initialization (the #else case) was standard since C90. Am I wrong here,
    >or are the compilers used non-conformant?


    Depends on whether asm6502 and asmz80 are automatic variables. If they are,
    the initializer isn't made up of compile-time constants, which is required
    for array initializers in C90.

    --
    Alan Curry
    Alan Curry, Jun 8, 2007
    #2
    1. Advertising

  3. Spiro Trikaliotis wrote:
    > Hello,
    >
    > in a project, I stumbled upon code like follows (incomplete):
    >
    > #if defined(MINIXVMD) || defined(MINIX_SUPPORT) || defined(__VBCC__) ||
    > #(defined(__BEOS__) && defined(WORDS_BIGENDIAN)) || define
    > d(WATCOM_COMPILE)
    > void *array[3];
    >
    > array[0]=&asm6502;
    > array[1]=&asmz80;
    > array[2]=NULL;
    > #else
    > void *array[3] = { &asm6502, &asmz80, NULL };
    > #endif
    >
    > I was very surprised to read this. I always thought the array
    > initialization (the #else case) was standard since C90. Am I wrong here,
    > or are the compilers used non-conformant?


    C90 requires array initialisers to be constant. How are asm6502 and asmz80
    declared?
    Harald van =?UTF-8?B?RMSzaw==?=, Jun 8, 2007
    #3
  4. Spiro Trikaliotis wrote:
    > #if defined(MINIXVMD) || defined(MINIX_SUPPORT) || defined(__VBCC__) || (defined(__BEOS__) && defined(WORDS_BIGENDIAN)) || define
    > d(WATCOM_COMPILE)
    > void *array[3];
    >
    > array[0]=&asm6502;
    > array[1]=&asmz80;
    > array[2]=NULL;
    > #else
    > void *array[3] = { &asm6502, &asmz80, NULL };
    > #endif
    >


    it is interesting that someone felt the need to add this ifdef

    the second declaration is nicer but with the ifdef that doesn't matter
    and the first works on any compiler i guess

    the strict condition of array initialization syntax in C90 can be
    quite annoying (initializer element should be computable at load time)
    Szabolcs Nagy, Jun 8, 2007
    #4
  5. Hello all,

    Alan Curry wrote:

    > In article <>,
    > Spiro Trikaliotis <> wrote:

    [...]
    >>#else
    >> void *array[3] = { &asm6502, &asmz80, NULL };
    >>#endif

    [...]
    >>I always thought the array initialization (the #else case) was
    >>standard since C90. Am I wrong here, or are the compilers used
    >>non-conformant?

    >
    > Depends on whether asm6502 and asmz80 are automatic variables. If they are,
    > the initializer isn't made up of compile-time constants, which is required
    > for array initializers in C90.


    Indeed, they are automatic variables, defined directly above the code
    snippet I presented. And as you all already found out, array is an
    automatic variable, too, as the #if part of the code snippet is
    intersparsed with code.

    Thus, indeed, I was wrong. Oh well, you get so used on compiler
    extensions that simply work, that you totally forget that they are
    extensions.

    Thank you all.

    Regards,
    Spiro.

    --
    Spiro R. Trikaliotis http://opencbm.sf.net/
    http://www.trikaliotis.net/ http://www.viceteam.org/
    Spiro Trikaliotis, Jun 9, 2007
    #5
  6. Hello,

    Szabolcs Nagy wrote:
    > Spiro Trikaliotis wrote:
    >> #if defined(MINIXVMD) || defined(MINIX_SUPPORT) || defined(__VBCC__) || (defined(__BEOS__) && defined(WORDS_BIGENDIAN)) || define
    >> d(WATCOM_COMPILE)

    [...]
    >> #else
    >> void *array[3] = { &asm6502, &asmz80, NULL };
    >> #endif
    >>

    >
    > it is interesting that someone felt the need to add this ifdef
    >
    > the second declaration is nicer but with the ifdef that doesn't matter
    > and the first works on any compiler i guess


    Indeed. I believe this might be because of some historic reasons. I
    assume the #else case was the first implementation. Then, people found
    out that some compilers complained (or behaved wrong? The part
    "(defined(__BEOS__) && defined(WORDS_BIGENDIAN))" look like the latter
    here), and the second implementation was addded. Yes, looking into the
    source control, there was more than one year between the implementation
    of the #else path, and the adding of the #ifdef.

    Regards,
    Spiro.

    --
    Spiro R. Trikaliotis http://opencbm.sf.net/
    http://www.trikaliotis.net/ http://www.viceteam.org/
    Spiro Trikaliotis, Jun 9, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. johny smith
    Replies:
    8
    Views:
    403
    Peter Koch Larsen
    Jul 2, 2004
  2. JKop
    Replies:
    10
    Views:
    926
  3. Matthias Kaeppler
    Replies:
    2
    Views:
    431
    Victor Bazarov
    Jul 18, 2005
  4. toton
    Replies:
    5
    Views:
    920
    Victor Bazarov
    Sep 28, 2006
  5. aaragon
    Replies:
    2
    Views:
    606
    James Kanze
    Nov 2, 2008
Loading...

Share This Page