cal*_*pto 3 c function-declaration
当我在其中一个源文件中遇到这个时,我正在浏览一些代码.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这种风格是什么?这是一种声明函数的模糊方法吗?有没有什么理由可以使用它而不是正常的函数声明?
它是一个旧的(但根据当前的C标准仍然有效)使用标识符列表的函数定义的语法.标识符的类型在标识符列表之后和左大括号之前声明.
最好使用带参数类型列表的函数,因为在这种情况下,具有函数原型的编译器可以检查函数调用的正确参数列表.
来自C标准(6.9.1函数定义)
6如果声明者包含一个标识符列表,则声明列表中的每个声明应至少有一个声明者,那些声明者只应声明标识符列表中的标识符,并且应声明标识符列表中的每个标识符.声明为typedef名称的标识符不得重新声明为参数.声明列表中的声明不应包含寄存器以外的存储类说明符,也不包含初始化.
你可以在旧的C代码中遇到其他有趣的结构,例如这个
memset( ( char * )p, value, n );
^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
因为类型void是后来介绍的.