c - What is the difference between defining a function type and a function pointer type? -


as know, can define function type:

typedef void (fn)(void); 

and can define function pointer type:

typedef void (*pfn)(void); 

there 2 functions. first function's parameter type function, , other function pointer:

void a(fn fn1) {     fn1(); }  void b(pfn fn1) {     fn1(); }   

i implement function callback:

void callback(void) {     printf("hello\n"); } 

and pass argument , b:

int main(void) {     a(callback);     b(callback);     return 0; } 

both , b work well, , print "hello".

so want know difference between defining function type , function pointer type? or actually, same?

given abuse can use function pointers (&func, func, *func, **func, … end same value function func), there few practical differences between two. can use fn * indicate pointer function, not trivial transform.

however, here's mild adaptation of code, using non-parameter variable of type pfn , attempting (unsuccessfully) use non-parameter variable of type fn. not compile, there difference when used @ file scope (global) or local scope , not in parameter list.

pfn.c

typedef void (fn)(void); typedef void (*pfn)(void);  static void callback(void) {     printf("hello\n"); }  static void a(fn fn1) {     fn fn2 = callback;     fn *fn3 = callback;     fn1();     fn2();     (*fn2)();     fn3();     (*fn3)(); }  static void b(pfn fn1) {     pfn fn2 = callback;     fn1();     fn2(); }    int main(void) {     a(callback);     b(callback);     return 0; } 

compilation

$ gcc -g -o3 -std=c99 -wall -wextra -wmissing-prototypes -wstrict-prototypes \ >     -werror  pfn.c -o pfn pfn.c: in function ‘a’: pfn.c:13:5: error: function ‘fn2’ initialized variable      fn fn2 = callback;      ^ pfn.c:13:8: error: nested function ‘fn2’ declared never defined      fn fn2 = callback;         ^ $ 

Comments

Popular posts from this blog

Android layout hidden on keyboard show -

google app engine - 403 Forbidden POST - Flask WTForms -

c - Why would PK11_GenerateRandom() return an error -8023? -