¿Cuál es esta extraña syntax de definición de función en C?

Recientemente, he visto algunas definiciones de funciones como esta mientras jugaba con GNU Bison:

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

¿Por qué el tipo de self fuera del paréntesis? ¿Es esto válido C?

Esas son antiguas declaraciones de parámetros de función de estilo K & R, que declaran los tipos de los parámetros por separado:

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

Esto es lo mismo que la forma más moderna de declarar parámetros de función:

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

Las declaraciones de “nuevo estilo” son, básicamente, universalmente preferidas.

Esta es la llamada variante “antigua” de declarar argumentos de función. En los viejos tiempos, no se podía simplemente escribir tipos de argumentos dentro del paréntesis, pero había que definirlo para cada argumento justo después del paréntesis de cierre.

En otras palabras, es equivalente a ripper_pos( VALUE self )

Sí, utiliza un estilo anterior de definición de función en el que los parámetros, sin tipo, se enumeran entre paréntesis, seguidos de la statement de esas variables con sus tipos antes de la llave de apertura del cuerpo de la función. Entonces el self es de tipo VALUE .

Esto es viejo c. K & R C usó esta convención, antes de los parámetros tipeados ANSI 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'. 

Esa es la syntax de statement de la función C de estilo antiguo .

Es realmente el código C antiguo, donde primero especifica los nombres de los argumentos y luego sus tipos. Ver por ejemplo aquí .