奇怪的C函数声明

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)

这种风格是什么?这是一种声明函数的模糊方法吗?有没有什么理由可以使用它而不是正常的函数声明?

Vla*_*cow 5

它是一个旧的(但根据当前的C标准仍然有效)使用标识符列表的函数定义的语法.标识符的类型在标识符列表之后和左大括号之前声明.

最好使用带参数类型列表的函数,因为在这种情况下,具有函数原型的编译器可以检查函数调用的正确参数列表.

来自C标准(6.9.1函数定义)

6如果声明者包含一个标识符列表,则声明列表中的每个声明应至少有一个声明者,那些声明者只应声明标识符列表中的标识符,并且应声明标识符列表中的每个标识符.声明为typedef名称的标识符不得重新声明为参数.声明列表中的声明不应包含寄存器以外的存储类说明符,也不包含初始化.

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

memset( ( char * )p, value, n );
        ^^^^^^^^^^  
Run Code Online (Sandbox Code Playgroud)

因为类型void是后来介绍的.