By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,778 Members | 1,919 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,778 IT Pros & Developers. It's quick & easy.

Array initialization when defining the array

P: n/a
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/
Jun 8 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
In article <sl***********************@news.trikaliotis.net> ,
Spiro Trikaliotis <ne*********@trikaliotis.netwrote:
....
>#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
pa****@world.std.com
Jun 8 '07 #2

P: n/a
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?
Jun 8 '07 #3

P: n/a

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)

Jun 8 '07 #4

P: n/a
Spiro Trikaliotis wrote:
>
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?
For char arrays, initialized with fixed strings. Not here.

--
<http://www.cs.auckland.ac.nz/~pgut001/pubs/vista_cost.txt>
<http://www.securityfocus.com/columnists/423>
<http://www.aaxnet.com/editor/edit043.html>
<http://kadaitcha.cx/vista/dogsbreakfast/index.html>
cbfalconer at maineline dot net

--
Posted via a free Usenet account from http://www.teranews.com

Jun 9 '07 #5

P: n/a
Hello all,

Alan Curry wrote:
In article <sl***********************@news.trikaliotis.net> ,
Spiro Trikaliotis <ne*********@trikaliotis.netwrote:
[...]
>>#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/
Jun 9 '07 #6

P: n/a
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/
Jun 9 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.