【问题标题】:What is this strange function definition syntax in C? [duplicate]C中这个奇怪的函数定义语法是什么? [复制]
【发布时间】:2011-03-02 06:24:54
【问题描述】:

我最近在玩 GNU Bison 时看到了一些这样的函数定义:

static VALUE
ripper_pos(self)
    VALUE self;
{
    //code here
}

为什么self的类型在括号外?这是有效的 C 吗?

【问题讨论】:

标签: c function definition


【解决方案1】:

那些是旧的 K&R 风格的函数参数声明,分别声明参数的类型:

int func(a, b, c)
   int a;
   int b;
   int c;
{
  return a + b + c;
}

这与更现代的声明函数参数的方式相同:

int func(int a, int b, int c)
{
  return a + b + c;
}

“新风格”声明基本上是普遍首选的。

【讨论】:

  • 如果您省略了任何参数的类型定义,则该参数将被假定为 int。此外,如果您省略了返回类型,它将被假定为 int。例如: func(a,b,c) { 返回 a+b+c; }
  • 只是 FWIW,K&R 风格有时仍用于代码高尔夫......
【解决方案2】:

这是声明函数参数的所谓“旧”变体。在过去,您不能只在括号内编写参数类型,而是必须在右括号之后为每个参数定义它。

也就是说,相当于ripper_pos( VALUE self )

【讨论】:

    【解决方案3】:

    是的,它使用旧式的函数定义,其中参数(无类型)列在括号中,然后在函数的左大括号之前声明这些变量及其类型身体。所以self 的类型是VALUE

    【讨论】:

      【解决方案4】:

      这是 c.在 ANSI C 强制类型化参数之前,K&R C 使用了这个约定。

      static VALUE  // A static function that returns 'VALUE' type.
      ripper_pos(self)  // Function 'ripper_pos' takes a parameter named 'self'.
          VALUE self;   // The 'self' parameter is of type 'VALUE'.
      

      【讨论】:

        【解决方案5】:

        【讨论】:

          【解决方案6】:

          这确实是旧的 C 代码,您首先指定参数名称,然后指定它们的类型。参见例如here

          【讨论】:

            猜你喜欢
            • 2011-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-18
            • 2014-04-28
            • 1970-01-01
            • 2011-06-24
            相关资源
            最近更新 更多