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

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

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

为什么是括号外的selftypes? 这是有效的C?

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

 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; } 

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

这是声明函数参数的所谓“旧”变体。 在过去的日子里,你不能只在圆括号内写出参数types,但是你必须在右括号之后的每个参数中定义它。

换句话说,它相当于ripper_pos( VALUE self )

是的,它使用了一种老式的函数定义,其中参数sanstypes在括号中列出,然后在函数体的左括号之前声明这些variables的types。 所以selfVALUEtypes的。

这是 c。 K&R C在ANSI C强制input参数之前使用了这个约定。

 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'. 

这是旧式的C函数声明语法 。

这是非常古老的C代码,您首先指定参数名称,然后指定它们的types。 在这里举个例子。