2013-07-21 20 views
24

Pensavo di conoscere la sintassi C abbastanza bene, fino a quando ho provato a compilare il seguente codice:Che cos'è una dichiarazione di inoltro dei parametri?

void f(int i; double x) 
{ 
} 

mi aspettavo che il compilatore di viaggio, e lo ha fatto, ma non ho ricevuto il messaggio di errore:

test.c:1:14: error: parameter ‘i’ has just a forward declaration 

ho poi provato

void fun(int i; i) 
{ 
} 

che riesce con

test.c:1:17: error: expected declaration specifiers or ‘...’ before ‘i’ 

e infine

void fun(int i; int i) 
{ 
} 

che, con mia grande sorpresa, riesce!

Non ho mai visto questa sintassi nel codice C del mondo reale. Qual è il suo uso?

+0

Che cosa è il tuo compilatore? Immagino sia un bug o un'estensione (non si compila con _clang 2.8_). – md5

+0

@ md5: GCC. Passa anche con '-std = c99'; Credo che avrei dovuto provare CLang, che viaggi. –

risposta

23

Questa forma di definizione della funzione:

void fun(int i; int i) 
{ 
} 

utilizza un'estensione GNU C chiamato parametro dichiarazione anticipata caratteristica.

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

Questa funzione permette di avere dei parametri dichiarazioni in avanti prima ha l'elenco dei parametri. Questo può essere usato, ad esempio, per funzioni con parametri array di lunghezza variabile per dichiarare un parametro size dopo il parametro array a lunghezza variabile.

Ad esempio:

// valid, len parameter is used after its declaration 
void foo(int len, char data[len][len]) {} 

// not valid, len parameter is used before its declaration 
void foo(char data[len][len], int len) {} 

// valid in GNU C, there is a forward declaration of len parameter 
// Note: foo is also function with two parameters 
void foo(int len; char data[len][len], int len) {} 

Nell'esempio OP,

void fun(int i; int i) {} 

dichiarazione del parametro in avanti non serve alcuno scopo in quanto non viene utilizzato in uno qualsiasi dei parametri effettivi e la funzione fun definizione è in realtà equivalente a:

void fun(int i) {} 

Nota che questa è un'estensione GNU C e non è C. compilazione con gcc e -std=c99 -pedantic darebbe le diagnostiche attesi:

avvertimento: ISO C vieta dichiarazioni di parametri avanti [-pedantic]

+2

Sì! quella teoria ISO, +1 a te e vorrei poter fare un +5 a OP per rompere le barriere provare qualcosa di insolito, almeno per me :) – 0decimal0

Problemi correlati