Ce qui est un paramètre déclaration anticipée?

je pensais que je savais de la syntaxe C assez bien, jusqu'à ce que j'ai essayé de compiler le code suivant:

void f(int i; double x)
{
}

Je m'attendais à ce que le compilateur trébuche, 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é?

28
demandé sur Fred Foo 2013-07-21 14:44:08

1 réponses

Cette forme de définition de la fonction:

void fun(int i; int i)
{
}

utilise une extension GNU C appelée paramètre de l'avant de la déclaration fonctionnalité.

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

Cette fonctionnalité permet de paramètre déclaration avant la liste 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 la variable longueur du paramètre de tableau.

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 des paramètres forward ne sert à rien puisqu'elle n'est utilisée dans aucun des paramètres actuels et le fun définition de la fonction est en fait équivalent à:

void fun(int i) {}

notez qu'il s'agit d'une extension GNU C et que ce N'est pas C. compiler avec gccet -std=c99 -pedantic donneraient le diagnostic attendu:

avertissement: ISO C l'interdit de l'avant déclarations de paramètres [-pédant]

26
répondu ouah 2013-07-21 11:54:55