C语言中这种奇怪的函数定义语法是什么?

C语言中这种奇怪的函数定义语法是什么?,c,function,definition,C,Function,Definition,最近在玩GNU Bison时,我看到了一些类似的函数定义: static VALUE ripper_pos(self) VALUE self; { //code here } 为什么self的类型在括号外?这是有效的C吗?是的,它使用了一种较旧的函数定义样式,其中参数sans type列在括号中,然后在函数体的大括号前声明这些变量及其类型。因此,self属于VALUE类型,这是声明函数参数的所谓“旧”变体。在过去,不能只在括号内写参数类型,但必须在右括号后为每个参数定义参数类型

最近在玩GNU Bison时,我看到了一些类似的函数定义:

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

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

是的,它使用了一种较旧的函数定义样式,其中参数sans type列在括号中,然后在函数体的大括号前声明这些变量及其类型。因此,
self
属于
VALUE

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


换句话说,它相当于裂土器位置(自身值)

,这是最重要的

这是一段非常古老的C代码,首先指定参数名,然后指定它们的类型。请参见示例。

这些是旧的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;
}
“新样式”声明基本上是普遍首选的。在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'.

请参阅。如果您省略了任何参数的类型定义,则该参数将假定为int。此外,如果您省略了返回类型,则将假定为int。例如:func(a,b,c){return a+b+c;}Just FWIW,K&R style有时仍用于代码golf。。。