2012-03-23 73 views
3

可能重复:
What is useful about this C syntax?
C variable declarations after function heading in definition
What weird C syntax is this?的C语句

我想了解一些代码,它有类似如下:

int getr(fget) 
FILE *fget; 
{ 
    /* More declarations and statements here */ 
    return (1); 
} 

是否有上述之间的任何差别:

int getr(fget) 
{ 
    FILE *fget; 
    /* More declarations and statements here */ 
    return (1); 
} 

如果是这样,他们是如何不同?

+0

@保罗R.你是正确的,这是问题的一个副本。是否可以编辑该问题的标题更具描述性? – mgilson 2012-03-23 17:43:13

回答

7

这两个函数都是以旧式(非原型)形式声明的。现在的C标准中旧式函数声明已经过时,C标准强烈阻止它们的使用。

在第二种形式中,没有提及假设为intfget参数类型。然后声明FILE *类型的另一个对象fget,并使用相同名称对参数变量进行遮蔽。

随着gcc-Wshadow警告选项会得到你一个警告,在你的第二个例子,因为参数的阴影中:

-Wshadow 
     Warn whenever a local variable shadows another local variable, 
     parameter or global variable or whenever a built-in function is shadowed. 
+0

所以我认为“鼓励”的方式来做到这一点:'int getr(FILE * fget){...}'? (最好使用文件顶部的原型) – mgilson 2012-03-23 06:47:06

+0

@mgilson:是的,您应该定义函数为:'int getr(FILE * fget){...}'。这是原型语法中的函数定义。请注意,此函数定义还可以作为稍后在源代码中的原型。 – ouah 2012-03-23 06:55:41

7

的第一个是K & R style of function definition,它是一个过时特征注释1

第二个是俗称为隐式int功能之前的c99标准。
c99之前如果一个函数没有返回显式类型,或者没有在声明中指定一个类型,那么该类型被假定为int

的方法都已经过时,并找到与C99标准中提及。

参考文献:
C99标准:前言第7段:

在第二版的主要变化包括:
- 删除隐式int类型
- 删除隐函数声明

参考1
6.11.7函数定义

与单独的参数标识符和声明列表 (未原型格式参数类型和标识符说明符)使用的函数定义为过时特征。

+0

请问:为什么downvote? – 2012-03-23 07:02:04

+0

不是我,但可能是因为你说K&R风格不符合标准?它仍然(甚至是C11)标准,但不推荐使用。 – 2012-03-23 07:07:40

+0

-1当你的整个评论是*“第一个是K&R风格的函数定义,它是非标准的。”*。气馁!=非标准。过时!=过时。如我错了请纠正我。 – Morpfh 2012-03-23 07:13:51