Non, définitivement non. Il est nécessaire de savoir les lire (dans le mauvais code des autres), mais il n'est pas utile de savoir les construire (dans son propre code).
Il vaut bien mieux 5 lignes de code simples que 1 ligne super compliquée.
Ça dépend par quoi tu accepte de remplacer la ligne compliquée.
Je vais prendre l'exemple canonique, signal.h, qui défini une fonction signal, qui prend en paramètre un entier (le signal) et une fonction (qui prend un entier et retourne rien) et qui retourne la précédente fonction associée à ce signal.
void(*signal(intsig,void(*func)(int)))(int);
S'il s'agit de remplacer cette ligne compliquée par
//en changeant la sémantique (s'exposant à des gros problèmes de concurrence):void(*old_fn)(int);voidsignal(int,void(*fn)(int));//ou bien, horrible, en affaiblissant les types :void*signal(int,void*);
Alors non, pas d'accord, il faut une ligne compliquée.
Mais, strictement équivalent (que l'on trouve dans certaine libc) :
[^] # Re: lecture oui, écriture non
Posté par Zylabon . En réponse au journal int *(*(*foo[])(int))(float*);. Évalué à 6. Dernière modification le 13 septembre 2014 à 20:48.
Le C autorise la définition de fonction d'ordre supérieur, c'est très précieux.
Ça dépend par quoi tu accepte de remplacer la ligne compliquée.
Je vais prendre l'exemple canonique,
signal.h, qui défini une fonctionsignal, qui prend en paramètre un entier (le signal) et une fonction (qui prend un entier et retourne rien) et qui retourne la précédente fonction associée à ce signal.S'il s'agit de remplacer cette ligne compliquée par
Alors non, pas d'accord, il faut une ligne compliquée.
Mais, strictement équivalent (que l'on trouve dans certaine libc) :
Là d'accord, c'est beau, c'est ce qu'on veut faire, et il faut savoir le faire.
AJOUT : Z'avez vu la colorisation du C du site bug avec le type de signal, faut faire le rapport de bug où ?
Please do not feed the trolls