maart@cs.vu.nl (Maarten Litmaath) (07/07/89)
----------8<----------8<----------8<----------8<----------8<----------
/* Any comments? */
struct foo {
int mids;
};
struct foo zork()
{
struct foo foo;
foo.mids = 79;
return foo;
}
/*
* Try:
* cc -DFOO foo.c
* cc -DBAR foo.c
* cc foo.c
* gcc -DFOO foo.c
* gcc -DBAR foo.c
* gcc foo.c
*
* and compare!
*/
main()
{
#if !FOO && !BAR
struct foo bar;
bar = zork();
#endif
printf("%d\n",
#if FOO
zork().mids
#else
#if BAR
(&zork())->mids
#else
bar.mids
#endif
#endif
);
}
----------8<----------8<----------8<----------8<----------8<----------
Results:
1) Sun 3/50 w/ SunOS 3.5 cc dislikes FOO, likes BAR
2) Sun 3/50 w/ SunOS 3.5 gcc 1.32 likes FOO, dislikes BAR
3) Sun 4/280 w/ SunOS Sys4-3.2 cc likes FOO, likes BAR
IMHO 2) is the winner! ISEHO 3) is right.
I say: zork() is a constant of type struct foo, so you cannot take its
address and it isn't an lvalue.
SE says: zork() is the name of a struct foo, so you CAN take its address.
--
"I HATE arbitrary limits, especially when |Maarten Litmaath @ VU Amsterdam:
they're small." (Stephen Savitzky) |maart@cs.vu.nl, mcvax!botter!maartfrank@zen.co.uk (Frank Wales) (07/11/89)
In article <2833@solo8.cs.vu.nl> maart@cs.vu.nl (Maarten Litmaath) writes: [program deleted] >I say: zork() is a constant of type struct foo, so you cannot take its >address and it isn't an lvalue. >SE says: zork() is the name of a struct foo, so you CAN take its address. IMHO, zork() is a constant too, and hence not an lvalue. Both the HP-PA cc (3.01) and its xdb agree, and although I would be the last person to advocate using a compiler to confirm the language definition, I trust this one more than most. Maybe SE is used to C on some lazy or old-fashioned machine (e.g., a Sun386i running 4.0.1 SunOS, which allows both this().that and (&these())->those, producing equivalent code). -- Frank Wales, Systems Manager, [frank@zen.co.uk<->mcvax!zen.co.uk!frank] Zengrange Ltd., Greenfield Rd., Leeds, ENGLAND, LS9 8DB. (+44) 532 489048 x217
shankar@hpclscu.HP.COM (Shankar Unni) (07/11/89)
> IMHO 2) is the winner! ISEHO 3) is right. > > I say: zork() is a constant of type struct foo, so you cannot take its > address and it isn't an lvalue. > SE says: zork() is the name of a struct foo, so you CAN take its address. You're right, the SE is wrong. zork() is not exactly a "constant", but it is an expression of type struct foo. However, it is *not* an lvalue so you cannot take its address. Since it is a structure expression, you can select a member (you do not have to have an lvalue to do a member selection, even though many compilers prevent you from selecting a member from a non-lvalue struct). Try this expression on for size: struct foo func1(), func2(); int i; (i ? func1() : func2()).mids; ---- Shankar Unni. Hewlett-Packard California Language Lab.