函数声明和花括号之间的C语句

3
我正在尝试理解一些代码,其中有以下内容:

可能重复:
这个C语法有什么用处?
C函数定义中函数头后的变量声明
这个奇怪的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);
}

如果是这样,它们有什么不同之处?

@Paul R. 您是正确的,这是那个问题的重复。是否可以编辑那个问题的标题以使其更具描述性? - mgilson
2个回答

9

这两个函数的声明是以旧式(非原型)形式进行的。在当前C标准中,旧式函数声明已经过时,强烈建议不要使用。

第二种形式中没有提到fget参数类型,它被假定为int类型。然后另一个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.

那么我假设“推荐”的方法是:int getr(FILE* fget) { ...}?(最好在文件顶部附带原型) - mgilson
@mgilson:是的,你应该将函数定义为:int getr(FILE* fget) { ...}。这是原型语法中的函数定义。请注意,此函数定义还充当源代码中以后的原型。 - ouah

7
第一个是K & R 函数定义风格,这是一个过时的特性Ref 1
第二个是在c99标准之前广为人知的隐式int特性。
在c99之前,如果函数没有返回显式类型或在声明中未指定类型,则假定类型为int
这两种方法都已被弃用,并在c99标准中提到。
参考资料:
C99标准:前言第7段:

第二版的主要变化包括:
— 删除了隐式int
— 删除了隐式函数声明

Ref 1
6.11.7 函数定义

使用具有单独的参数标识符和声明列表的函数定义(不是原型格式的参数类型和标识符声明)是一个过时的特性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接