I came across this piece of code and completely get lost for it meaning.
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
So would someone like to explain the code line 2 at some detail? I know that void and int are types, that *func is a pointer for a function, and that brackets are for priority. But I still don't get the (*signal ...), the (int), and the whole thing combined together. The more detailed the better. But if you could not provide a lot of detail, a few words are also welcome.
Thanks to all the explanation, probably I've known the meaning/effect of this declaration. But I make some more trial to help me understand what's going on, as below:
1 #include <signal.h>
2 void (*signal)(int sig, void (*func)(int));
3 void (*signal)(int); // then void (signal)(int) again.
4 //void (*signal(int sig, void (*func)(int)))(int); //break this line into two lines above
5
6 int main(){}
In the above code, I broke void (*signal(int sig, void (*func)(int)))(int)
into two lines. For line 3, I tried both void (*signal)(int)
and void (signal)(int)
, with the same error result that indicates I was trying to redeclare signal
:
TestDeclaration.c:2: error: 'signal' redeclared as different kind of symbol /usr/include/signal.h:93: error: previous declaration of 'signal' was here
TestDeclaration.c:3: error: 'signal' redeclared as different kind of symbol /usr/include/signal.h:93: error: previous declaration of 'signal' was here
Now I know both the trial are incorrect ways of declaration, but why are they incorrect? Why is the original way of declaration NOT a Redeclaration?
Well, I didn't notice that Bart van Ingen Schenau had answered this question to some extent.