web-dev-qa-db-fra.com

Qu'est-ce qu'une déclaration de paramètre avant?

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é?

32
Fred Foo

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 gccet -std=c99 -pedantic donnerait le diagnostic attendu:

avertissement: ISO C interdit les déclarations de paramètres avant [-pedantic]

29
ouah