Я просматривал код, когда сталкивался с этим в одном из исходных файлов .
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
был введен позже.