c - son - tags jsp
¿Qué es una declaración directa de parámetros? (1)
Pensé que conocía bastante bien la sintaxis de C, hasta que intenté compilar el siguiente código:
void f(int i; double x)
{
}
Esperé que el compilador se disparara, y lo hizo, pero no recibo el mensaje de error:
test.c:1:14: error: parameter ‘i’ has just a forward declaration
Entonces intenté
void fun(int i; i)
{
}
que falla con
test.c:1:17: error: expected declaration specifiers or ‘...’ before ‘i’
y finalmente
void fun(int i; int i)
{
}
Lo cual, para mi sorpresa, lo consigue!
Nunca he visto esta sintaxis en el código C del mundo real. ¿Cuál es su uso?
Esta forma de definición de función:
void fun(int i; int i)
{
}
utiliza una extensión C de GNU llamada característica de declaración de parámetros .
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
Esta función le permite tener declaraciones de reenvío de parámetros antes de la lista real de parámetros. Esto se puede usar, por ejemplo, para funciones con parámetros de matriz de longitud variable para declarar un parámetro de tamaño después del parámetro de matriz de longitud variable.
Por ejemplo:
// 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) {}
En el ejemplo OP,
void fun(int i; int i) {}
La declaración de parámetros hacia adelante no sirve para nada, ya que no se usa en ninguno de los parámetros reales y la definición de la función fun
es realmente equivalente a:
void fun(int i) {}
Tenga en cuenta que esta es una extensión GNU C y no C. La -std=c99 -pedantic
con gcc
y -std=c99 -pedantic
daría el diagnóstico esperado:
advertencia: ISO C prohíbe las declaraciones de parámetros de avance [-pedante]