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

时间:2012-03-23 06:17:57

标签: c curly-braces

  

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

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

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

以上与之间有什么区别:

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

如果是这样,它们有何区别?

2 个答案:

答案 0 :(得分:8)

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

在第二种形式中,没有提到假定为fget的{​​{1}}参数类型。然后声明另一个类型为int的对象fget,它会以相同的名称隐藏参数变量。

使用FILE * gcc警告选项会在第二个示例中向您发出警告,因为参数的阴影:

-Wshadow

答案 1 :(得分:7)

第一个是 K & R style of function definition ,它是一个过时的功能 Ref 1

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

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

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

  

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

参考1
6.11.7功能定义

  

使用具有单独参数标识符和声明列表的函数定义   (不是prototype-format参数类型和标识符声明符)是一个过时的功能。