Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Array initialization when defining the array

Reply
Thread Tools

Array initialization when defining the array

 
 
Spiro Trikaliotis
Guest
Posts: n/a
 
      06-08-2007
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/
 
Reply With Quote
 
 
 
 
Alan Curry
Guest
Posts: n/a
 
      06-08-2007
In article <(E-Mail Removed)>,
Spiro Trikaliotis <(E-Mail Removed)> 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
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
 
 
 
Harald van =?UTF-8?B?RMSzaw==?=
Guest
Posts: n/a
 
      06-08-2007
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?
 
Reply With Quote
 
Szabolcs Nagy
Guest
Posts: n/a
 
      06-08-2007

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)

 
Reply With Quote
 
Spiro Trikaliotis
Guest
Posts: n/a
 
      06-09-2007
Hello all,

Alan Curry wrote:

> In article <(E-Mail Removed)>,
> Spiro Trikaliotis <(E-Mail Removed)> 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/
 
Reply With Quote
 
Spiro Trikaliotis
Guest
Posts: n/a
 
      06-09-2007
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/
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
initialization of array as a member using the initialization list aaragon C++ 2 11-02-2008 04:57 PM
array initialization in initialization list. toton C++ 5 09-28-2006 05:13 PM
Initialization via ctor vs. initialization via assignment Matthias Kaeppler C++ 2 07-18-2005 04:25 PM
Default Initialization Vs. Value Initialization JKop C++ 10 09-22-2004 07:26 PM
defining or not defining destructors johny smith C++ 8 07-02-2004 08:51 AM



Advertisments