everyone, I have this piece of the code:
void foo(int var, int var1)
{
printf("%d\n", var);
printf("%d\n", var1);
}
void foo_for_foo( void (*some_function)(int, int))
{
int x = 5;
some_function(x, x);
}
int main()
{
void (*ptr_foo); // <- look here
ptr_foo = &foo;
foo_for_foo(ptr_foo);
return 0;
}
does it matter how do I define pointer to function:
1) void (*ptr_foo);
2) void (*ptr_foo)(int, int);
my compiler receives both versions
thanks in advance for the explanations of the difference
The two forms are not equivalent.
void (*ptr_foo)is not a function pointer at all. It’s a normal, non-function void pointer. The parentheses are superfluous and misleading. It’s exactly as if you had writtenvoid* ptr_foo.void (*ptr_foo)(int, int)is the proper way to declare a function pointer to a function taking twoints and returningvoid.The only reason that this works is because in C,
voidpointers are implicitly convertible to any other type of pointer. That is, you can assign any other pointer to avoid*, and you can assign avoid*to any other pointer.But the fact that this works in this example is essentially an accident of syntax. You cannot in general replace
void (*foo)(int, int)withvoid (*foo).If you try doing that with
some_functionin the argument list tofoo_for_foo, your compiler will complain when you try to invokesome_functionbecause it is not a function pointer.Similarly, if your
foofunction happened to return anintinstead ofvoid, you would notice the problem right away. Declaringptr_fooasint (*ptr_foo)would have resulted in an error on the statementptr_foo = &foobecause unlikevoidpointers,intpointers are not implicitly convertible to other pointer types.In short, always use the second form. It is the only one that is correct in general, despite this fluky case.