奇怪的C函数声明

时间:2015-11-19 23:03:34

标签: c function-declaration

当我在其中一个enter image description here中遇到此代码时,我正在浏览一些代码。

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;
    }
}

这种风格是什么?这是一种声明函数的模糊方法吗?是否有一些理由可以将其用于正常的函数声明?

1 个答案:

答案 0 :(得分:5)

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

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

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

  

6如果声明者包含一个标识符列表,则每个声明都在   声明清单应至少有一个声明者   声明者只应声明标识符列表中的标识符,   并且应声明标识符列表中的每个标识符。一个   声明为typedef名称的标识符不得重新声明为   参数。声明清单中的声明应包含否   除寄存器和没有初始化之外的存储类说明符。

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

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

因为稍后会引入类型void