graham@orca.UUCP (Graham Bromley) (12/17/84)
> I have a routine which resembles the following: > > int (*f)(); > int fa(), fb(); > > fa() { > f = fb; > return(f); > } > > fb() { > } > > The problem with the above is that lint complains about an > illegal combination of a pointer with an integer in the > 'return' statement. I have tried various casts and function > declarations to try to satisfy lint, but none of them have > worked. Does anybody know what I should do to keep lint happy? > >> I played around with the code for about 30 minutes and the only >> thing I accomplished was to make lint core dump twice. I only >> see one way of doing it and C apparently doesn't support it. >> That way is to declare fa() as: >> >> int ((*fa)())(); >> >> This is broken down from: >> >> int (*x)(); /* x is a pointer to a function returning an int */ >> int ((*y)())(); /* y is function returning a ptr to a func returning an int */ >> >> However, both lint and cc complain with 'function returns illegal >> type'. May I suggest using casts? No no no! The only problem here is incorrect usage of C syntax. You want to declare a function returning a pointer to an integer function. Build up the type declaration as you say it: 1. fa is a function fa() 2. returning a pointer to *fa() 3. an integer int *fa() 4. function int (*fa())() You need the () around *fa() in step 3. because the () operator is evaluated left to right. If this is too confusing (function pointer syntax is rarely crytal clear) use a typedef: typedef int (*IFPTR)(); /* int func ptr */ IFPTR fa(); /* func returning ptr to int func */ To call fa then the function whose address is returned by fa, say: (*fa(a1, a2, ...))(b1, b2, ...) where the a1 etc are fa's arguments, and the b1 etc. are the arguments of the function whose address is returned by fa. Or you could say: int (*f)(); f = fa(a1, a2, ...); (*f)(b1, b2, ...); if you want to remember the function pointer returned by fa. gbgb, aka the longjmp artist (an unfair alias)