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é?
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 gcc
et -std=c99 -pedantic
donneraient le diagnostic attendu:
avertissement: ISO C l'interdit de l'avant déclarations de paramètres [-pédant]