edhall%rand-unix@sri-unix.UUCP (08/19/83)
Try:
static void (*p[N])();
In general, remember that modifiers to a given type (that is,
(), *, and []) are parsed right-to-left, successively modifying
the base type of the item. Parentheses can change this order.
Thus, the above declaration parses:
[N] Array of N
* Pointers to
() Functions returning
void type `void',
static storage class `static'.
Another toughie would be an array of pointers to functions returning
strings:
char *(p[N])();
With a bit of practice, though, creating data types in C is about
as simple as any other language. Some complain that C is `backwards'
from languages like PASCAL. This is because the C declaration was
designed to be an example of the use of the object declared; thus,
using the second declaration for `p', above, the value of `x' in:
x = *(p[n])();
is of type `char'. This `declaration by example' is more of a feature
than a obstacle.
-Ed Hall
Rand Corporationclark.wbst@PARC-MAXC.ARPA (08/19/83)
The VAX-11 C book has an excellent explaination on figuring out such things. --Ray Clark
mann%Shasta@su-score@sri-unix.UUCP (08/25/83)
From: Tim Mann <mann%Shasta@su-score>
The proper syntax for a typedef that defines a type "pointer to
function returning void" would be
typedef void (*P_ADDR)();
The next trick is to figure out how to declare a static array of these
pointers, WITHOUT using the above typedef. That one had me tearing my
hair until I gave up and used the typedef.
--Timromkey%mit-csr@sri-unix.UUCP (08/26/83)
From: John L. Romkey <romkey@mit-csr>
I believe that the msg about types from Ed Hall had a bug in it. The
second example was an array of pointers to functions returning strings, and
Ed used
char *(p[N])();
as the declaration. But this is actually an array of functions returning
strings, which shouldn't mean much to most C compilers. What you really need
here is another *, as in:
char *(*p[N])();
and when calling one of these functions, you want to say:
x = *(*p[n])();
I still remember the awful pain of trying to figure out how to declare a
function which returned a pointer to a function which returned an int.
- John Romkey
romkey@mit-csredhall%rand-unix@sri-unix.UUCP (08/26/83)
Sorry about that; it was after midnight and I wanted to get home. You're quite right about the missing `*'. -Ed