奇怪的 C 函数声明
Weird C function declaration
当我在其中一个 source files.
中遇到这个时,我正在检查一些代码
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 If the declarator includes an identifier list, each declaration in
the declaration list shall have at least one declarator, those
declarators shall declare only identifiers from the identifier list,
and every identifier in the identifier list shall be declared. An
identifier declared as a typedef name shall not be redeclared as a
parameter. The declarations in the declaration list shall contain no
storage-class specifier other than register and no initializations.
您可以在旧的 C 代码中遇到其他有趣的结构,例如这个
memset( ( char * )p, value, n );
^^^^^^^^^^
因为类型void
是后来引入的。
当我在其中一个 source files.
中遇到这个时,我正在检查一些代码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 If the declarator includes an identifier list, each declaration in the declaration list shall have at least one declarator, those declarators shall declare only identifiers from the identifier list, and every identifier in the identifier list shall be declared. An identifier declared as a typedef name shall not be redeclared as a parameter. The declarations in the declaration list shall contain no storage-class specifier other than register and no initializations.
您可以在旧的 C 代码中遇到其他有趣的结构,例如这个
memset( ( char * )p, value, n );
^^^^^^^^^^
因为类型void
是后来引入的。