Array initialization when defining the array

  • Thread starter Spiro Trikaliotis
  • Start date
S

Spiro Trikaliotis

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.
 
A

Alan Curry

Spiro Trikaliotis said:
#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.
 
H

Harald van =?UTF-8?B?RMSzaw==?=

Spiro said:
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?
 
S

Szabolcs Nagy

Spiro said:
#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)
 
S

Spiro Trikaliotis

Hello all,

Alan said:
#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.
 
S

Spiro Trikaliotis

Hello,

Szabolcs said:
Spiro said:
#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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,565
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top