jeff@isi-vaxa.arpa (Jeffery A. Cavallaro) (11/28/85)
After all the talk about null object pointers on machines with non-zero null addresses, how would you portably define a null routine pointer?: Assume that the routine returns a short, - The following don't seem to work: #define NULLROUTINE ((short *()) 0) #define NULLROUTINE ((short *) 0()) And: #define NULLROUTINE ((short *0)()) or #define NULLROUTINE ((short)(*0)()) If all of the above make no sense...Then what? Jeff
gwyn@BRL.ARPA (VLD/VMB) (11/29/85)
((short (*)()) 0)
alexis@reed.UUCP (Alexis Dimitriadis) (12/02/85)
> After all the talk about null object pointers on machines with non-zero > null addresses, how would you portably define a null routine pointer?: Remember cdecl?? It says: ----------- % cdecl cast NULL into pointer to function returning short (short (*)())NULL ----------- so: #define NULLROUTINE ((short (*)()) 0 ) will do fine. Remember, NULL _is_ 0, even on machines where (byte pattern) zero is a valid address!! Alexis Dimitriadis -- _______________________________________________ Any opinions expressed above have been grown organically and contain no preservatives or artificial sweeteners. alexis @ reed {decvax,ihnp4,ucbcad,uw-beaver}!tektronix!reed.UUCP
bilbo.niket@locus.ucla.edu (Niket K. Patwardhan) (12/02/85)
Don't believe me 100%... things have changed since I learned my C. Try this (short (*)) 0 Doug Gwyn, Jim Cottrell, Ron Natalie .... do you want to confirm this?
bilbo.niket@locus.ucla.edu (Niket K. Patwardhan) (12/02/85)
I forgot a pair of parenthesis. (short (*())) 0
keesan@bbncc5.UUCP (Morris M. Keesan) (12/03/85)
The request was for a way to specify a null pointer to a function returning
short. Doug Gwyn correctly responded with ((short (*)()) 0). Note that the
form of the type specification is copied directly from section 8.7 of the
C Reference Manual in K&R (page 200), and therefore very safe.
For real readability, I as usual suggest the typedef method:
typedef short FS(); /* FS = Function returning Short */
typedef FS *PFS; /* PFS = Pointer to Function returning Short */
#define NULLROUTINE ((PFS)0) /* Isn't this much clearer? */
--
Morris M. Keesan
keesan@bbn-unix.ARPA
{decvax,ihnp4,etc.}!bbncca!keesanjsdy@hadron.UUCP (Joseph S. D. Yao) (12/03/85)
In article <218@brl-tgr.ARPA> bilbo.niket@locus.ucla.edu (Niket K. Patwardhan) writes: >I forgot a pair of parenthesis. >(short (*())) 0 Good: you added a pair of parentheses. Bad: one fell short. If I assigned this value to func, then called it, I would have to say: (*func)() The type that this returns is short. (Short int, more formally.) Therefore, I'd have to declare func: short int (*func)() and cast this (short int (*)()) 0. Doug already said this, but without explanation. -- Joe Yao hadron!jsdy@seismo.{CSS.GOV,ARPA,UUCP}
kenny@uiucdcsb.CS.UIUC.EDU (12/03/85)
/* Written 7:08 pm Nov 27, 1985 by jeff@isi-vaxa.arpa in uiucdcsb:net.lang.c */
/* ---------- "NULL ROUTINE POINTERS" ---------- */
After all the talk about null object pointers on machines with non-zero
null addresses, how would you portably define a null routine pointer?:
Assume that the routine returns a short, -
The following don't seem to work:
#define NULLROUTINE ((short *()) 0)
#define NULLROUTINE ((short *) 0())
And:
#define NULLROUTINE ((short *0)())
or
#define NULLROUTINE ((short)(*0)())
If all of the above make no sense...Then what?
Jeff /* End of text from
uiucdcsb:net.lang.c */
To make a cast, write a (fully-parenthesized) declaration of one item of the
desired type, and then take out the name. So, if you want a pointer to a
function returning short, you might say
short (*pfs) ();
To cast 0 to this type, it's
(short (*) ()) 0;
so
#define NULL_FUNCTION ((short (*) ()) 0)
Kevin
kenny@Uiuc.ARPA kenny@Uiuc.CSNET
{ihnp4, pur-ee, convex}!uiucdcs!kenny
No opinions are expressed here, so no disclaimer is needed.