una tag son prototipos los lib función funciones etiquetas cuales c syntax parameters forward-declaration

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]