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

mgi*_*son 3 c curly-braces

可能重复:
这个C语法有用吗?
在定义中的函数标题之后的C变量声明
这是什么奇怪的C语法?

我正在尝试理解一些代码,它具有以下内容:

int getr(fget)
FILE *fget;
{
   /* More declarations and statements here */
   return (1);
}
Run Code Online (Sandbox Code Playgroud)

以上和之间有什么区别:

int getr(fget)
{
   FILE *fget;
   /* More declarations and statements here */
   return (1);
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,他们有什么不同?

oua*_*uah 9

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

在第二种形式中,没有提到fget假设为a 的参数类型int.然后声明另一个fget类型的对象,FILE *它使用相同的名称隐藏参数变量.

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

   -Wshadow
       Warn whenever a local variable shadows another local variable, 
       parameter or global variable or whenever a built-in function is shadowed.
Run Code Online (Sandbox Code Playgroud)


Alo*_*ave 7

第一个是K&R风格的功能定义,它是一个过时的功能Ref 1.

第二种通常被称为c99标准之前的隐式int功能.
在c99之前如果函数没有返回显式类型或者没有在声明中指定类型,则假定类型为a int.

这两种方法都已被弃用,并在c99标准中找到了提及.

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

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

参考文献1
6.11.7函数定义

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