2013-07-21 3 views
24

Ich dachte, ich C-Syntax recht gut kannte, bis ich den folgenden Code zu kompilieren versucht:Was ist eine Parameter-Forward-Deklaration?

void f(int i; double x) 
{ 
} 

ich den Compiler auslösen erwartet, und es tat, aber ich habe nicht die Fehlermeldung:

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

ich habe dann versucht

void fun(int i; i) 
{ 
} 

die mit

schlägt fehl

und schließlich

void fun(int i; int i) 
{ 
} 

, die viel zu meiner Überraschung gelingt!

Ich habe diese Syntax nie in realem C-Code gesehen. Was nützt es?

+0

Was ist Dein Übersetzer? Ich denke, es ist entweder ein Bug oder eine Erweiterung (kompiliert nicht mit _clang 2.8_). – md5

+0

@ md5: GCC. Passt auch mit '-std = c99'; Ich denke, ich hätte CLang ausprobiert, welche Reisen. –

Antwort

23

Diese Form der Funktionsdefinition:

void fun(int i; int i) 
{ 
} 

verwendet eine GNU C Erweiterung der Parameter Vorwärtsdeklaration Funktion genannt.

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

Mit dieser Funktion können Sie Parameter vorwärts Erklärungen vor der eigentlichen Liste der Parameter haben. Dies kann beispielsweise für Funktionen mit Array-Parametern variabler Länge verwendet werden, um einen Größenparameter nach dem Array-Parameter variabler Länge zu deklarieren.

Zum Beispiel:

// 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) {} 

Im OP Beispiel

void fun(int i; int i) {} 

die Vorwärts Parameter Deklaration keinen Zweck dient, da es nicht in einem der aktuellen Parameter und der fun Funktion verwendet wird Definition entspricht tatsächlich:

void fun(int i) {} 

Hinweis: Dies ist eine Erweiterung GNU C und es ist nicht C. Kompilieren mit gcc und -std=c99 -pedantic würden die erwarteten Diagnose geben:

Warnung: ISO C verbietet Vorwärts-Parameter Erklärungen [-pedantic]

+2

Ja! diese ISO-Theorie, +1 an dich und ich wünschte, ich hätte eine +5 machen können, um die Grenzen zu durchbrechen, etwas Ungewöhnliches zu versuchen, zumindest für mich :) – 0decimal0