c - What's the difference between these 2 declarations? -
here's simple , delicate question. explain difference between , b?
void (*a)(int x, int y) void (*b(int x, int y))(int)
this question arise following linux function declaration:
void (*signal(int sig, void (*func)(int)))(int);
solution
the following program makes demo.
#include <signal.h> #include <stdio.h> #include <unistd.h> void ouch(int sig) { printf("ouch! - got signal %d\n", sig); signal(sigint, sig_dfl); } void (*g())(int) // b { return ouch; } int main() { void (*f)(int); // f=g(); signal(sigint, f); while(1) { printf("hello, world!\n"); sleep(1); } }
the designers of c chose name types in way use case of type matches, closely possible, way in use type value. so, example, when have declaration like
int a;
you can a
int
. if have type like
int *a;
then have dereference a
writing *a
int
.
you can use similar, albeit more complex, logic decode types posted. let's start with
void (*a)(int x, int y)
this says if dereference a
(by writing *a
), you're left looks like
void (int x, int y)
which function taking in 2 int
s , returns void
. in other words, can think of a
pointer function; once dereferenced, function.
now beast:
void (*b(int x, int y))(int)
this one's trickier. idea follows. if take b
, pass in 2 arguments it, looks this:
void (*)(int)
which pointer function taking in int
, returning void
. in other words, b
function takes 2 arguments, returns function pointer takes 1 argument , returns void
.
it's tricky decode these types, don't seem them written way , instead use typedef
simplify things. example, typedef:
typedef void (*functiontakingtwoints)(int, int);
says can use functiontakingtwoints
define function pointer points @ function takes in 2 int
s , returns void
. here, declaration of a
simplifies down to
functiontakingtwoints a;
similarly, in case of b
, let's define type
typedef void (*functiontakingoneint)(int);
now, can rewrite b
as
functiontakingoneint b(int x, int y);
from which, think, it's clearer type means.
hope helps!
Comments
Post a Comment