2010-06-10 16 views
33

he visto un par de definiciones de funciones como esto recientemente mientras juega con GNU Bison:¿Cuál es esta extraña sintaxis de definición de función en C?

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

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

+0

Ver [¿qué es útil sobre la sintaxis de C?] (Http://stackoverflow.com/questions/1630631/what-is-useful-about-this-c-syntax). –

Respuesta

34

Aquellos son viejos K declaraciones de parámetros de funcionamiento del estilo & 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; 
} 

Ésta es la misma que la forma más moderna para declarar parámetros de la función:

Las declaraciones de "nuevo estilo" son universalmente preferidas.

+7

Si omite la definición de tipo para cualquier parámetro, se supondrá que ese parámetro es int. Además, si omite el tipo de devolución, se supondrá que es int. e.g: func (a, b, c) {return a + b + c; } – Ferruccio

+3

El estilo Just FWIW, K & R todavía se usa a veces para code golf ... –

4

Sí, se utiliza un estilo más antiguo de la definición de la función en la que los parámetros, el tipo sans, se enumeran entre paréntesis, seguido de la declaración de las variables con sus tipos antes de la llave de apertura del cuerpo de la función. Entonces, self es del tipo VALUE.

9

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)

2

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

3

Esto es viejo c. K & R C utilizó 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'. 
Cuestiones relacionadas