Je suis tombé sur ce morceau de code et je me suis complètement perdu en interprétant sa signification.Quelle est la signification de ce morceau de code? void (* signal (int sig, void (* func) (int))) (int);
#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);
Qu'est-ce qu'une explication détaillée du code à la ligne 2?
Je sais que void
et int
sont des types, le * func est un pointeur pour une fonction, et les parenthèses sont pour la priorité. Mais je n'obtiens toujours pas le (* signal ...), le (int) et le tout ensemble. Le plus détaillé, le mieux. J'ai probablement connu le sens/l'effet de cette déclaration. Mais je devais faire quelques essais plus pour me 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, je me suis cassé void (*signal(int sig, void (*func)(int)))(int)
en deux lignes. Pour la ligne 3, j'ai essayé à la fois void (*signal)(int)
et void (signal)(int)
, avec le même résultat d'erreur indiquant que je tentais 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 moyens incorrects de déclaration, mais pourquoi sont-ils incorrects ? Pourquoi la manière originale de déclaration n'est-elle PAS une redéclaration?
+1 pour montrer que vous comprenez réellement * certains * par opposition à * aucun *. – BoltClock
Essayez http://www.cdecl.org –
Curieusement, cdecl.org donne une erreur de syntaxe sur celui-ci. Quelqu'un peut-il expliquer cela? –