• [^] # Re: lecture oui, écriture non

    Posté par . En réponse au journal int *(*(*foo[])(int))(float*);. Évalué à 6. Dernière modification le 13 septembre 2014 à 20:48.

    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).

    Le C autorise la définition de fonction d'ordre supérieur, c'est très précieux.

    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(int sig, 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);
    void signal(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) :

    typedef void (*sighandler_t)(int);
    sighandler_t signal(int, sighandler_t);

    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