Déclaration de fonction C bizarre

Je parcourais du code lorsque je l’ai rencontré dans l’un des fichiers source .

int st_insert(table, key, value) register st_table *table; register st_data_t key; st_data_t value; { unsigned int hash_val, bin_pos; register st_table_entry *ptr; hash_val = do_hash(key, table); FIND_ENTRY(table, ptr, hash_val, bin_pos); if (ptr == 0) { ADD_DIRECT(table, key, value, hash_val, bin_pos); return 0; } else { ptr->record = value; return 1; } } 

Quel est ce style? Est-ce une façon obscure de déclarer des fonctions? Y a-t-il une raison pour laquelle on pourrait utiliser ceci au-dessus des déclarations de fonction normales?

    Il s’agit d’une ancienne syntaxe (mais toujours valide selon la norme C actuelle) des définitions de fonctions utilisant une liste d’identifiants. Les types des identifiants sont déclarés après la liste d’identifiants et avant l’accolade d’ouverture.

    Il est préférable d’utiliser des fonctions avec des listes de types de parameters car dans ce cas, le compilateur ayant un prototype de fonction peut vérifier la liste correcte des arguments pour un appel de fonction.

    A partir de la norme C (6.9.1 Définitions de fonctions)

    6 Si le déclarant inclut une liste d’identifiants, chaque déclaration de la liste de déclarations doit avoir au moins un déclarant. Ces déclarants ne déclarent que les identifiants de la liste d’identifiants et chaque identifiant de la liste d’identifiants doit être déclaré. Un identifiant déclaré en tant que nom de typedef ne doit pas être redéclaré en tant que paramètre. Les déclarations de la liste de déclarations ne doivent contenir aucun spécificateur de classe de stockage autre que register et aucune initialisation.

    Vous pouvez rencontrer d’autres constructions amusantes dans l’ancien code C, comme par exemple

     memset( ( char * )p, value, n ); ^^^^^^^^^^ 

    parce que le type void été introduit plus tard.