2010-06-10 11 views
33

Ho visto un paio di definizioni di funzioni come questo di recente mentre gioca con GNU Bison:Che cos'è questa sintassi di definizione di una strana funzione in C?

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

Perché è il tipo di self al di fuori della parentesi? È valido C?

+0

Sede [cosa è utile su questa sintassi C?] (Http://stackoverflow.com/questions/1630631/what-is-useful-about-this-c-syntax). –

risposta

34

quelle sono vecchie K & R dichiarazioni di parametri funzione di stile, dichiarando i tipi dei parametri separatamente:

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

Questo è lo stesso come il modo più moderno di dichiarare i parametri di funzione:

Le dichiarazioni di "nuovo stile" sono sostanzialmente universalmente preferite.

+7

Se si omette la definizione del tipo per qualsiasi parametro, si presume che tale parametro sia int. Inoltre, se si omette il tipo di reso, si presume che sia int. per esempio: func (a, b, c) {return a + b + c; } – Ferruccio

+3

Solo lo stile FWIW, K & R è ancora usato a volte per il codice golf ... –

4

Sì, utilizza uno stile precedente di definizione di funzione in cui i parametri, tipo sans, sono elencati tra parentesi, seguiti dalla dichiarazione di tali variabili con i loro tipi prima della parentesi aperta del corpo della funzione. Quindi self è di tipo VALUE.

9

Questa è la cosiddetta "vecchia" variante di dichiarazione degli argomenti della funzione. In passato, non si poteva semplicemente scrivere i tipi di argomento all'interno delle parentesi, ma bisognava definirlo per ogni argomento subito dopo la parentesi di chiusura.

In altre parole, è equivalente a ripper_pos(VALUE self)

2

È veramente vecchio codice C, in cui si specificano prima i nomi degli argomenti e quindi i loro tipi. Vedi ad esempio here.

3

Questo è vecchio c. K & R C utilizzato questa convenzione, prima dei parametri tipizzati forzati 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'.