【问题标题】:C statement between function declaration and curly brace [duplicate]函数声明和大括号之间的C语句[重复]
【发布时间】:2012-04-07 18:14:39
【问题描述】:

可能重复:
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);
}

如果是,它们有何不同?

【问题讨论】:

  • @Paul R. 你是对的,这是那个问题的副本。是否可以编辑该问题的标题以使其更具描述性?

标签: c curly-braces


【解决方案1】:

这两个函数都以旧式(非原型)形式声明。旧式函数声明在当前 C 标准中已过时,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:是的,您应该将函数定义为:int getr(FILE* fget) { ...}。这是原型语法中的函数定义。请注意,此函数定义也可用作源代码后面的原型。
【解决方案2】:

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

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

这两种方法都已被弃用,并在 c99 标准中有所提及。

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

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

参考 1
6.11.7 函数定义

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2012-11-27
    • 2020-03-28
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多