Je suis tombé sur ce morceau de code et je me suis complètement perdu en interprétant sa signification.
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
Quelle est l'explication détaillée du code à la ligne 2 ?
Je sais que void
y int
sont des types, le *func est un pointeur pour une fonction, et les parenthèses sont pour la priorité. Mais je ne comprends toujours pas le (*signal ...), le (int), et tout le reste combiné ensemble. Plus c'est détaillé, mieux c'est.
J'ai probablement connu le sens/effet de cette déclaration. Mais j'ai dû faire quelques essais supplémentaires pour m'aider à comprendre ce qui se passe, comme ci-dessous :
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(){}
Dans le code ci-dessus, j'ai cassé void (*signal(int sig, void (*func)(int)))(int)
en deux lignes. Pour la ligne 3, j'ai essayé les deux void (*signal)(int)
y void (signal)(int)
avec le même résultat d'erreur qui indiquait que j'essayais de redéclarer 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
Maintenant, je sais que les deux essais sont des manières incorrectes de déclarer, mais pourquoi sont-elles incorrectes ? Pourquoi la manière originale de déclarer n'est-elle PAS une redéclaration ?