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;
}
}
这种风格是什么?这是一种声明函数的模糊方法吗?是否有一些理由可以将其用于正常的函数声明?
答案 0 :(得分:5)
使用标识符列表的函数定义的语法是旧的(但根据当前的C标准仍然有效)。标识符的类型在标识符列表之后和左括号之前声明。
最好使用带参数类型列表的函数,因为在这种情况下,具有函数原型的编译器可以检查函数调用的正确参数列表。
来自C标准(6.9.1函数定义)
6如果声明者包含一个标识符列表,则每个声明都在 声明清单应至少有一个声明者 声明者只应声明标识符列表中的标识符, 并且应声明标识符列表中的每个标识符。一个 声明为typedef名称的标识符不得重新声明为 参数。声明清单中的声明应包含否 除寄存器和没有初始化之外的存储类说明符。
你可以在旧的C代码中遇到其他有趣的结构,例如这个
memset( ( char * )p, value, n );
^^^^^^^^^^
因为稍后会引入类型void
。