Je pensais que je connaissais assez bien la syntaxe C, jusqu'à ce que j'essaie de compiler le code suivant:
void f(int i; double x)
{
}
Je m'attendais à ce que le compilateur se déclenche, et il l'a fait, mais je ne reçois pas le message d'erreur:
test.c:1:14: error: parameter ‘i’ has just a forward declaration
J'ai ensuite essayé
void fun(int i; i)
{
}
qui échoue avec
test.c:1:17: error: expected declaration specifiers or ‘...’ before ‘i’
et enfin
void fun(int i; int i)
{
}
qui, à ma grande surprise, réussit!
Je n'ai jamais vu cette syntaxe dans le code C du monde réel. Quelle est son utilité?
Cette forme de définition de fonction:
void fun(int i; int i)
{
}
utilise une extension GNU C appelée la fonction de déclaration avant de paramètre ).
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
Cette fonctionnalité vous permet d'avoir des déclarations de paramètres avant la liste réelle des paramètres. Cela peut être utilisé par exemple pour des fonctions avec des paramètres de tableau de longueur variable pour déclarer un paramètre de taille après le paramètre de tableau de longueur variable.
Par exemple:
// 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) {}
Dans l'exemple OP,
void fun(int i; int i) {}
la déclaration de paramètre avant ne sert à rien car elle n'est utilisée dans aucun des paramètres réels et la définition de la fonction fun
est en fait équivalente à:
void fun(int i) {}
Notez qu'il s'agit d'une extension GNU C et non de C. Compilation avec gcc
et -std=c99 -pedantic
donnerait le diagnostic attendu:
avertissement: ISO C interdit les déclarations de paramètres avant [-pedantic]