C语言中的函数语法

时间:2012-03-01 16:59:20

标签: c

我对C很新,我一直在研究别人的代码,我发现了这个功能:

static
    cp_file(output, input, record, ft)
    dy_char  *output;     /* output file */
    dy_char  *input;      /* input file */
    dy_char  *record;     /* record id */
    int     ft;          /* file type */
    {

这与说这个完全相同:

static cp_file(dy_char *output, dy_char *input, dy_char *record, int ft) {   

一个比另一个更有效,还是纯粹是一种不同的语法风格?如果它们不同,有什么区别?

3 个答案:

答案 0 :(得分:4)

不,他们不一样。

第一种形式是旧式函数定义,第二种形式是函数定义的原型形式。

它们在传递转换的参数方面有所不同。具有原型转换参数的函数就好像通过赋值一样,而非原型函数就像在第一个示例中那样执行默认参数提升。

旧表单的参数转换:

  

(C99,6.5.2.2p6)“如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有float类型的参数提升为double。这些被称为默认参数促销。“

原型表格的参数转换:

  

(C99,6.5.2.2p7)“如果表示被调用函数的表达式具有包含原型的类型,则参数被隐式转换,就像通过赋值一样,转换为相应参数的类型,每个参数的类型是其声明类型的非限定版本。“

请注意,旧表格(非原型)已过时,强烈建议不要使用。

  

(C99,6.11.7p1未来语言方向)“使用具有单独参数标识符和声明列表的函数定义(不是原型格式参数类型和标识符声明符)是一个过时的功能。”

答案 1 :(得分:2)

两者都相同,但是,
后者是标准的符合语法,而前者是模糊的 K&R syntax

总是,在编写任何新代码时使用标准符合的方式,旧的代码库可能会使用K& R语法,因为它是当时常用的语法。

答案 2 :(得分:2)

是的,除非ouah指出,否则这两种陈述大多相同。这是用于声明函数的“原始”ANSI前语法。它在1990年代早期就被废弃了。