Объявление функции Weird C

Я просматривал код, когда сталкивался с этим в одном из исходных файлов .

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; } } 

Что это за стиль? Это какой-то неясный способ объявить функции? Есть ли какая-то причина, по которой это можно было бы использовать над нормальными объявлениями функций?

    Это старый (но все еще действительный в соответствии с текущим стандартом C) синтаксис определений функций с использованием списка идентификаторов. Типы идентификаторов объявляются после списка идентификаторов и перед открывающей скобкой.

    Лучше использовать функции с списками типов параметров, поскольку в этом случае компилятор, имеющий прототип функции, может проверить правильный список аргументов для вызова функции.

    Из стандарта C (определения функций 6.9.1)

    6 Если декларатор включает список идентификаторов, каждое объявление в списке декларации должно содержать как минимум один декларатор, эти деклараторы должны объявлять только идентификаторы из списка идентификаторов, а каждый идентификатор в списке идентификаторов должен быть объявлен. Идентификатор, объявленный как имя typedef, не должен быть переоформлен в качестве параметра. Объявления в списке объявлений не должны содержать спецификатора classа хранения, отличного от регистра, и без инициализации.

    Вы можете встретить другие забавные конструкции в старом C-коде, например, это

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

    потому что тип void был введен позже.