奇怪的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名称的标识符不得重新声明为参数。 声明列表中的声明不应包含寄存器以外的存储类说明符,也不包含初始化。

你可以在旧的C代码中遇到其他有趣的结构,例如这个

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

因为类型void后来被引入。